Upload
others
View
3
Download
1
Embed Size (px)
Citation preview
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
Renan Roggia
Software Engineer @
/RRoggia
/in/renanroggia