Microservices Reativos · Importante quando o produtor está mais rápido que o consumidor...

43
Microservices Reativos A experiência no Tiago Dolphine

Transcript of Microservices Reativos · Importante quando o produtor está mais rápido que o consumidor...

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

[email protected]

/tiagodolphine

/tiagodolphine