Post on 23-Jan-2018
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
+3MM pedidos / mês
+16K restaurantes ativos
+4MM usuários ativos
+140K requests/min
+200 instâncias em Cloud
Um pouco do passado...
Programação imperativaDescrevemos 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 aceitável
Falhas não podem impactar
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
Sync
Async
Reactive Programing● Paradigma baseado no consumo de eventos● Alteração de dados "over time" -> dispara ações (callback)● Publish-Subscribe● Lógica declarativa e composição de operações● Async e non-blocking● Escalar vertical -> poucas threads● Contexto local (não distribuído)● Desacoplamento no tempo (concorrência)
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"
ReactorImplementaçã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: mainNumber: 2 Thread: mainNumber: 4 Thread: mainNumber: 6 Thread: mainNumber: 8 Thread: mainNumber: 10 Thread: mainNumber: 12 Thread: mainNumber: 14 Thread: mainNumber: 16 Thread: mainNumber: 18 Thread: main
Number: 4 Thread: parallel-2Number: 10 Thread: parallel-2Number: 16 Thread: parallel-2Number: 0 Thread: parallel-1Number: 6 Thread: parallel-1Number: 12 Thread: parallel-1Number: 18 Thread: parallel-1Number: 2 Thread: parallel-3Number: 8 Thread: parallel-3Number: 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>
Source: Spring Reference Documentation(9)
https://github.com/tiagodolphine/spring5-reactive-playgroundhttps://github.com/tiagodolphine/reactor-playground
Talk is cheap show me the code
Reactive SystemsReatividade 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 100k450k
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 3MM pedidos e transição de estados● Push de pedidos polling● ⇩Tempos de recepção de pedidos● Disponibilidade de restaurantes (centralizado)● Elasticidade com recursos menores● Independência do sistema legado● Mais responsivo e resiliente (às falhas)
DificuldadesDebug
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ências1. 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