Microservices Reativos · Importante quando o produtor está mais rápido que o consumidor...
Transcript of Microservices Reativos · Importante quando o produtor está mais rápido que o consumidor...
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
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
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
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 !
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();
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-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
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● 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
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