Spring MVC ou Webflux · 2019. 11. 28. · Spring MVC ou Webflux Escolhendo a melhor stack para sua...

Post on 04-Oct-2020

3 views 1 download

Transcript of Spring MVC ou Webflux · 2019. 11. 28. · Spring MVC ou Webflux Escolhendo a melhor stack para sua...

Globalcode – Open4education

Spring MVC ou WebfluxEscolhendo a melhor stack para sua aplicação

Renan Roggia - Ironi Medina

Globalcode – Open4education

Breve contexto

Globalcode – Open4education

Agenda

Escolhendo a stack

Linguagem de programação

Web framework

Spring Webflux

Diferenças

Paradigmas

Modelos de concorrências

O que deu certo

O que deu errado

Escolhendo sua stack Spring

Globalcode – Open4education

Escolhendo a linguagem

de programação

Globalcode – Open4education

Requerimento: Performance

Baseline de performance

Java + Spring

Python + flask

Go

Javascript + express

Teste de performance: basic routing

Primeira escolha

Globalcode – Open4education

Primeira escolha

Requerimento: Performance

Baseline de performance

Java + Spring

Python + flask

Go

Javascript + express

Teste de performance: basic routing

Globalcode – Open4education

Primeira escolha

Requerimento: Performance

Baseline de performance

Java + Spring

Python + flask

Go

Javascript + express

Teste de performance: basic routing

Globalcode – Open4education

Decisão

Java + Spring

Maturidade técnica do time e projeto

Globalcode – Open4education

Escolhendo o Web

Framework

Globalcode – Open4education

Segunda escolha

Requerimento: Performance e produtividade

Baseline de performance

MVC

Webflux

Teste de performance: routing

Com autenticação

HTTP vs AMQP

Globalcode – Open4education

Segunda escolha

Requerimento: Performance e produtividade

Baseline de performance

MVC

Webflux

Teste de performance: routing

Com autenticação

HTTP vs AMQP

Globalcode – Open4education

Segunda escolha

Requerimento: Performance e produtividade

Baseline de performance

MVC

Webflux

Teste de performance: routing

Com autenticação

HTTP vs AMQP

Globalcode – Open4education

O que é o Spring Webflux

Versão reativa do Spring MVC

Novo modelo de concorrência

Baseado no projeto Reactor 3

Suporte a operações non-blocking

Endpoints funcionais

Suporte a testes reativos

Globalcode – Open4education

Spring WebFlux

“For a non-blocking web stack to handle

concurrency with a small number of

threads and scale with fewer hardware

resources.”

Source: https://docs.spring.io/spring/docs/current/spring-framework-reference/web-reactive.html

Globalcode – Open4education

O que é o Spring Webflux

Globalcode – Open4education

Diferenças Técnicas

MVC

Servlet API

Servlet Container

Modelo de concorrência: One

Thread per request

Thread pool grande

Paradigma: Imperativo e

Funcional

Webflux

Reactive Streams

Netty, Servlet Container (+3.1)

Modelo de concorrência: Event

loop

Thread per core

Worker thread para I/O

Paradigma: Reativo

Globalcode – Open4education

Diferenças Técnicas

MVC

Servlet API

Servlet Container

Modelo de concorrência: One

Thread per request

Thread pool grande

Paradigma: Imperativo e

Funcional

Webflux

Reactive Streams

Netty, Servlet Container (+3.1)

Modelo de concorrência: Event

loop

Thread per core

Worker thread para I/O

Paradigma: Reativo

Globalcode – Open4education

Paradigmas

Forma como pensamos e vemos o mundo em

termos de programação

Várias formas de fazer; diferentes paradigmasdada uma lista de jogadores, filtrar apenas os que possuem mais de

35 anos e jogam no Brasil, e transformar em passível de

aposentadoria

Globalcode – Open4education

Paradigmas - Imperativo

mais simples e mais utilizado

fácil compreensão e aprendizagem

passo a passo do que queremos fazer

variáveis para guardar estado

for/while para controlar fluxo

foca em COMO o processo deve ser feito

Globalcode – Open4education

Paradigmas - Funcional

não guarda estado

não existe mutação de variáveis

resultado da função depende somente do input

recursividade para iterações

define O QUE deve ser feito sem se preocupar

como

Globalcode – Open4education

Paradigmas - Reativo

também conhecido como funcional abstrato

mais complexo dos três

fluxo de dados assíncronos

eventos que podem ocorrer em diferentes

momentos

aplica funções (funcional) quando o dado está

disponível

Globalcode – Open4education

Paradigmas

Globalcode – Open4education

Modelos de Concorrência

Thread

Thread

ThreadRequest

Request

Request

HTTP

HTTP

HTTPSelector Worker

Thread

HTTP

HTTP

HTTP

WEBFLUX

Globalcode – Open4education

One thread per request model

Application

HTTP

Thread

Thread

ThreadRequest

Request

Request

HTTP

HTTP

HTTP

HTTP

HTTP

Globalcode – Open4education

Síncrono e bloqueante

Globalcode – Open4education

“Waiting within the servlet is an inefficient

operation as it is a blocking operation that

consumes a thread and other limited

resources.”

Java Servlet Specification 3.1

Globalcode – Open4education

Async e bloqueanteFeio mas arrumadinho

Globalcode – Open4education

Async e Não bloqueanteTekpix

\

Globalcode – Open4education

Source: https://www.infoq.com/articles/Servlet-and-Reactive-Stacks-Spring-Framework-5/

Globalcode – Open4education

Alternativas ao Servlet API?

Globalcode – Open4education

Spring WebFlux

ApplicationSelector Worker

Thread

HTTP

HTTP

HTTP

HTTP

HTTP

HTTP

WEBFLUX

Globalcode – Open4education

Modelo de concorrência e

performance

13879

30370

19429

81537

0

10000

20000

30000

40000

50000

60000

70000

80000

90000

HTTP AMQP

MVC vs Webflux && HTTP vs AMQP

MVC WebFlux

Globalcode – Open4education

Melhor utilização de recurso

Throughput

Memória

Threads

Globalcode – Open4education

“Se o palestrante não mostra o lado ruim,

desconfie”

Globalcode – Open4education

O que deu errado

Precisa do maldito subscribe()

Dependências bloqueantes

Autenticação

MDC

Operadores

Complexidade

Debugging

Encadeamento

Globalcode – Open4education

O que deu errado

Precisa do maldito subscribe()

Dependências bloqueantes

Autenticação

MDC

Operadores

Complexidade

Debugging

Encadeamento

Globalcode – Open4education

O que deu errado

Precisa do maldito subscribe()

Dependências bloqueantes

Autenticação

MDC

Operadores

Complexidade

Debugging

Encadeamento

Globalcode – Open4education

O que deu errado

Precisa do maldito subscribe()

Dependências bloqueantes

Autenticação

MDC

Operadores

Complexidade

Debugging

Encadeamento

Globalcode – Open4education

O que deu errado

Precisa do maldito subscribe()

Dependências bloqueantes

Autenticação

MDC

Operadores

Complexidade

Debugging

Encadeamento

Globalcode – Open4education

O que deu errado

Precisa do maldito subscribe()

Dependências bloqueantes

Autenticação

MDC

Operadores

Complexidade

Debugging

Encadeamento

Globalcode – Open4education

O que funcionou pra nós

Planejar tempo para aprendizado

Reforçar Generics e java.util.function

Testar diferentes operadores

reactor/lite-rx-api-hands-on

Pair programming e refactor

Globalcode – Open4education

O que funcionou pra nós

Planejar tempo para aprendizado

Reforçar Generics e java.util.function

Testar diferentes operadores

reactor/lite-rx-api-hands-on

Pair programming e refactor

Globalcode – Open4education

O que funcionou pra nós

Planejar tempo para aprendizado

Reforçar Generics e java.util.function

Testar diferentes operadores

reactor/lite-rx-api-hands-on

Pair programming e refactor

Globalcode – Open4education

O que funcionou pra nós

Planejar tempo para aprendizado

Reforçar Generics e java.util.function

Testar diferentes operadores

reactor/lite-rx-api-hands-on

Pair programming e refactor

Globalcode – Open4education

O que funcionou pra nós

Planejar tempo para aprendizado

Reforçar Generics e java.util.function

Testar diferentes operadores

reactor/lite-rx-api-hands-on

Pair programming e refactor

Globalcode – Open4education

Escolhendo sua stack

Spring

Globalcode – Open4education

Concluindo

Linguagem de programação

Maturidade

Web framework

Diferenças

Paradigmas

Modelo de concorrências

Nossas experiências

Dicas

Escolhendo sua stack Spring

Globalcode – Open4education

THANK YOU

Ironi Medina

Software Engineer @

/ironijunior

/in/ironi-junior-medina

ironimedina@gmail.com

Renan Roggia

Software Engineer @

/RRoggia

/in/renanroggia

renanzr@gmail.com