Microservices Reativos
A experiência no
Tiago Dolphine
Tiago Dolphine
Order food from
App or Web
Restaurant receives
the order
Confirms the order
and prepare
Back office
operators
Customer search
for restaurants
APIs
Online Delivery
+3.5MM pedidos / mês
+16K restaurantes ativos
+4MM usuários ativos
+140K requests/min
+200 instâncias em Cloud
Um pouco do passado...
Programação imperativa
Descrevemos como um programa deve se comportar
Sequência de passos (comandos)
Chamadas para alterar o estado de um recurso
Tradicional
Fácil entendimento e ensino
Mas com o crescimento . . .
Número de acessos
Consumo de recursos
Tempo de resposta deve ser aceitável
Falhas não podem impactar o negócio
Popularização de Cloud Computing
Adoção de Microservices
Sistemas de software precisam
acompanhar esta evolução!
Sistemas de software precisam
REAGIR !
Reactive Manifesto (2013… 2014...)
Responsive: sempre responder e com baixa latência
Resilient: sem downtime, responder mesmo em situações de falha
Elastic: responder mesmo quando for sobrecarregado, auto escalar
Message Driven: comunicação por mensagens async, baixo acoplamento
Mas porquê Reactive ?
Blocking ...
Blocking pode ser um desperdício !
Tempo de resposta pode ficar comprometido
Paralelizar: performance com aumento de Threads
Threads são custosas e limitadas
I/O é lento (chamadas para DB, HTTP…)
Threads esperando resposta :(
Desperdício de recurso !
Blocking
Total = T1 + T2+ T3
Non-Blocking
Total < T1 + T2+ T3
Reactive Programing
Paradigma baseado no consumo de eventos
Evento -> dispara ações (callback)
Lógica declarativa (o que ao invés de como)
Async e non-blocking
Escalar vertical -> poucas threads
Contexto local (não distribuído)
Reactive streams
● Padronização de APIs: manipulação de streams de dados
● Backpressure
○ Feedback enviado para o produtor quando o consumidor está pronto para consumir
○ Importante quando o produtor está mais rápido que o consumidor
● Frameworks: Reactor, RxJava, Akka, Vert.x …
● Java 9: java.util.concurrent.Flow
* Source: Reactive Streams (4)
"Padrão para processamento de fluxo de dados assíncrono com backpressure non-blocking" *
Reactor
"Reactor is a fourth-generation Reactive library for building non-blocking
applications on the JVM based on the Reactive Streams Specification"
Reactor
Implementação de reactive streams
Publisher
● Mono: 0 ou 1 item
● Flux: sequencia async de 0 a N itens
Subscribers
● Consumir dados de publishers (callbacks de sucesso, erro, completo)
● subscribe() -> trigger para startar fluxo de dados
● Nada ocorre sem subscribe()
Exemplo
Flux.range(0, 20)
.filter(n -> n % 2 == 0)
.map(n -> "Number: " + n)
.subscribe(s -> System.out.println( s + " Thread: " + Thread.currentThread().getName()));
Number: 0 Thread: main
Number: 2 Thread: main
Number: 4 Thread: main
Number: 6 Thread: main
Number: 8 Thread: main
Number: 10 Thread: main
Number: 12 Thread: main
Number: 14 Thread: main
Number: 16 Thread: main
Number: 18 Thread: main
Number: 4 Thread: parallel-2
Number: 10 Thread: parallel-2
Number: 16 Thread: parallel-2
Number: 0 Thread: parallel-1
Number: 6 Thread: parallel-1
Number: 12 Thread: parallel-1
Number: 18 Thread: parallel-1
Number: 2 Thread: parallel-3
Number: 8 Thread: parallel-3
Number: 14 Thread: parallel-3
CountDownLatch countDownLatch = new CountDownLatch(1);
Flux.range(0, 20)
.parallel(3)
.runOn(Schedulers.parallel())
.filter(n -> n % 2 == 0)
.map(n -> "Number: " + n)
.doOnTerminate(() -> countDownLatch.countDown())
.subscribe(s -> System.out.println(s + " Thread: " + Thread.currentThread().getName()));
countDownLatch.await();
Never block a reactive code !
Spring 5.0
Novo módulo Reativo WebFlux
Non-blocking HTTP adaptado em Reactive Streams API
Cliente e Servidor reactive
Reactor
Flux / Mono nas APIs
Netty, Undertow, Servlet 3.1 NIO
HttpServletRequest → ServerHttpRequest
InputStream / OutputStream → Flux<DataBuffer>
https://github.com/tiagodolphine/spring5-reactive-playground
https://github.com/tiagodolphine/reactor-playground
Talk is cheap show me the code
Reactive Systems
Reatividade em sistemas distribuídos
Desacoplamento
● Tempo: concorrência e paralelismo
● Espaço: transparência na localização de componentes
Conjunto de padrões arquiteturais e princípios
● Message based
● Resilience
● Elasticity
● …
● Location transparency
Aplicar princícios reactive em microservices !
Rapidez de crescimento
Microservices
Escalabilidade
Disponibilidade
Legado
2011
Pedidos / Mês
20162013 2014 2015
20k
100k
450k
1M
2,8M
3,5M
Almoço Jantar
Alguns problemas atacados
Entrega de pedidos aos restaurantes
Sincronização de dados entre sistemas
Integrações com parceiros
Disparo de tarefas (sms, push, emails, cancelamentos…)
Princípios reactive aplicados em microservices
Princípios reactive aplicados
● Messaging ⬅ message driven
● HTTP (async processing) ⬅ non-blocking
● Circuit breakers ⬅ responsive
● Retry ⬅ resilient, responsive
● Recovery ⬅ resilient
● ACK Events ⬅ resilient
● Eternal cache (with refresh) ⬅ resilient, responsive
● Auto-Scaling ⬅ elastic
● Reactive Programming ⬅ non-blocking
● Load balancers ⬅ location transparency
Auto Scaling
ReactorMicroservices
Resultados positivos
16K restaurantes conectados
Entrega de 3.5MM pedidos e transição de estados
Push de pedidos polling
⇩Tempos de recepção de pedidos
Elasticidade com recursos menores
Independência do sistema legado
Mais responsivo e resiliente (às falhas)
Dificuldades
Debug
Trace de erros e logging
Curva maior para novos desenvolvedores
Dependência de rede e infraestrutura
Monitoramento de lógica específica de cada serviço
Maturidade em ambiente de produção custosa
Concluindo...
Migraçao para microservices é realidade
Aplicar princípios reactive entre microservices
Reactive programming internamente para microservices
Melhor uso de recursos (mais com menos)
Necessário para acompanhar todo crescimento!
Referências
1. http://projectreactor.io
2. http://projectreactor.io/docs/core/release/reference/docs/index.html
3. http://www.reactivemanifesto.org
4. http://www.reactive-streams.org
5. https://www.oreilly.com/ideas/reactive-programming-vs-reactive-systems
6. http://www.oreilly.com/programming/free/developing-reactive-microservices.csp
7. http://www.oreilly.com/programming/free/reactive-microservices-architecture-orm.csp
8. https://spring.io/search?q=Notes+on+Reactive+Programming
9. http://docs.spring.io/spring-framework/docs/5.0.x/spring-framework-reference/html/web-reactive.html
10. https://community.oracle.com/docs/DOC-1006738
11. https://spring.io/blog/2016/04/19/understanding-reactive-types
Tiago Dolphine
/tiagodolphine
tiagodolphine@gmail.com
/tiagodolphine
/tiagodolphine

Devcamp 2017 Microservices Reativos

  • 1.
  • 2.
  • 3.
    Order food from Appor Web Restaurant receives the order Confirms the order and prepare Back office operators Customer search for restaurants APIs Online Delivery
  • 4.
    +3.5MM pedidos /mês +16K restaurantes ativos +4MM usuários ativos +140K requests/min +200 instâncias em Cloud
  • 5.
    Um pouco dopassado...
  • 7.
    Programação imperativa Descrevemos comoum programa deve se comportar Sequência de passos (comandos) Chamadas para alterar o estado de um recurso Tradicional Fácil entendimento e ensino
  • 8.
    Mas com ocrescimento . . . Número de acessos Consumo de recursos Tempo de resposta deve ser aceitável Falhas não podem impactar o negócio Popularização de Cloud Computing Adoção de Microservices
  • 9.
    Sistemas de softwareprecisam acompanhar esta evolução!
  • 10.
    Sistemas de softwareprecisam REAGIR !
  • 11.
  • 12.
    Responsive: sempre respondere com baixa latência Resilient: sem downtime, responder mesmo em situações de falha Elastic: responder mesmo quando for sobrecarregado, auto escalar Message Driven: comunicação por mensagens async, baixo acoplamento
  • 13.
  • 14.
  • 15.
    Blocking pode serum desperdício ! Tempo de resposta pode ficar comprometido Paralelizar: performance com aumento de Threads Threads são custosas e limitadas I/O é lento (chamadas para DB, HTTP…) Threads esperando resposta :( Desperdício de recurso !
  • 16.
  • 17.
  • 18.
    Reactive Programing Paradigma baseadono consumo de eventos Evento -> dispara ações (callback) Lógica declarativa (o que ao invés de como) Async e non-blocking Escalar vertical -> poucas threads Contexto local (não distribuído)
  • 19.
    Reactive streams ● Padronizaçãode APIs: manipulação de streams de dados ● Backpressure ○ Feedback enviado para o produtor quando o consumidor está pronto para consumir ○ Importante quando o produtor está mais rápido que o consumidor ● Frameworks: Reactor, RxJava, Akka, Vert.x … ● Java 9: java.util.concurrent.Flow * Source: Reactive Streams (4) "Padrão para processamento de fluxo de dados assíncrono com backpressure non-blocking" *
  • 20.
    Reactor "Reactor is afourth-generation Reactive library for building non-blocking applications on the JVM based on the Reactive Streams Specification"
  • 21.
    Reactor Implementação de reactivestreams Publisher ● Mono: 0 ou 1 item ● Flux: sequencia async de 0 a N itens Subscribers ● Consumir dados de publishers (callbacks de sucesso, erro, completo) ● subscribe() -> trigger para startar fluxo de dados ● Nada ocorre sem subscribe()
  • 22.
    Exemplo Flux.range(0, 20) .filter(n ->n % 2 == 0) .map(n -> "Number: " + n) .subscribe(s -> System.out.println( s + " Thread: " + Thread.currentThread().getName())); Number: 0 Thread: main Number: 2 Thread: main Number: 4 Thread: main Number: 6 Thread: main Number: 8 Thread: main Number: 10 Thread: main Number: 12 Thread: main Number: 14 Thread: main Number: 16 Thread: main Number: 18 Thread: main
  • 23.
    Number: 4 Thread:parallel-2 Number: 10 Thread: parallel-2 Number: 16 Thread: parallel-2 Number: 0 Thread: parallel-1 Number: 6 Thread: parallel-1 Number: 12 Thread: parallel-1 Number: 18 Thread: parallel-1 Number: 2 Thread: parallel-3 Number: 8 Thread: parallel-3 Number: 14 Thread: parallel-3 CountDownLatch countDownLatch = new CountDownLatch(1); Flux.range(0, 20) .parallel(3) .runOn(Schedulers.parallel()) .filter(n -> n % 2 == 0) .map(n -> "Number: " + n) .doOnTerminate(() -> countDownLatch.countDown()) .subscribe(s -> System.out.println(s + " Thread: " + Thread.currentThread().getName())); countDownLatch.await();
  • 24.
    Never block areactive code !
  • 25.
    Spring 5.0 Novo móduloReativo WebFlux Non-blocking HTTP adaptado em Reactive Streams API Cliente e Servidor reactive Reactor Flux / Mono nas APIs Netty, Undertow, Servlet 3.1 NIO HttpServletRequest → ServerHttpRequest InputStream / OutputStream → Flux<DataBuffer>
  • 26.
  • 27.
    Reactive Systems Reatividade emsistemas distribuídos Desacoplamento ● Tempo: concorrência e paralelismo ● Espaço: transparência na localização de componentes Conjunto de padrões arquiteturais e princípios ● Message based ● Resilience ● Elasticity ● … ● Location transparency
  • 28.
    Aplicar princícios reactiveem microservices !
  • 29.
  • 30.
    2011 Pedidos / Mês 201620132014 2015 20k 100k 450k 1M 2,8M 3,5M
  • 31.
  • 32.
    Alguns problemas atacados Entregade pedidos aos restaurantes Sincronização de dados entre sistemas Integrações com parceiros Disparo de tarefas (sms, push, emails, cancelamentos…)
  • 33.
  • 34.
    Princípios reactive aplicados ●Messaging ⬅ message driven ● HTTP (async processing) ⬅ non-blocking ● Circuit breakers ⬅ responsive ● Retry ⬅ resilient, responsive ● Recovery ⬅ resilient ● ACK Events ⬅ resilient ● Eternal cache (with refresh) ⬅ resilient, responsive ● Auto-Scaling ⬅ elastic ● Reactive Programming ⬅ non-blocking ● Load balancers ⬅ location transparency
  • 35.
  • 36.
    Resultados positivos 16K restaurantesconectados Entrega de 3.5MM pedidos e transição de estados Push de pedidos polling ⇩Tempos de recepção de pedidos Elasticidade com recursos menores Independência do sistema legado Mais responsivo e resiliente (às falhas)
  • 38.
    Dificuldades Debug Trace de errose logging Curva maior para novos desenvolvedores Dependência de rede e infraestrutura Monitoramento de lógica específica de cada serviço Maturidade em ambiente de produção custosa
  • 39.
    Concluindo... Migraçao para microservicesé realidade Aplicar princípios reactive entre microservices Reactive programming internamente para microservices Melhor uso de recursos (mais com menos) Necessário para acompanhar todo crescimento!
  • 40.
    Referências 1. http://projectreactor.io 2. http://projectreactor.io/docs/core/release/reference/docs/index.html 3.http://www.reactivemanifesto.org 4. http://www.reactive-streams.org 5. https://www.oreilly.com/ideas/reactive-programming-vs-reactive-systems 6. http://www.oreilly.com/programming/free/developing-reactive-microservices.csp 7. http://www.oreilly.com/programming/free/reactive-microservices-architecture-orm.csp 8. https://spring.io/search?q=Notes+on+Reactive+Programming 9. http://docs.spring.io/spring-framework/docs/5.0.x/spring-framework-reference/html/web-reactive.html 10. https://community.oracle.com/docs/DOC-1006738 11. https://spring.io/blog/2016/04/19/understanding-reactive-types
  • 41.