41
Microservices Reativos A experiência no Tiago Dolphine

Devcamp 2017 Microservices Reativos

Embed Size (px)

Citation preview

Page 1: Devcamp 2017   Microservices Reativos

Microservices Reativos

A experiência no

Tiago Dolphine

Page 2: Devcamp 2017   Microservices Reativos

Tiago Dolphine

Page 3: Devcamp 2017   Microservices Reativos

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

Page 4: Devcamp 2017   Microservices Reativos

+3.5MM pedidos / mês

+16K restaurantes ativos

+4MM usuários ativos

+140K requests/min

+200 instâncias em Cloud

Page 5: Devcamp 2017   Microservices Reativos

Um pouco do passado...

Page 6: Devcamp 2017   Microservices Reativos
Page 7: Devcamp 2017   Microservices Reativos

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

Page 8: Devcamp 2017   Microservices Reativos

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

Page 9: Devcamp 2017   Microservices Reativos

Sistemas de software precisam acompanhar esta evolução!

Page 10: Devcamp 2017   Microservices Reativos

Sistemas de software precisam REAGIR !

Page 11: Devcamp 2017   Microservices Reativos

Reactive Manifesto (2013… 2014...)

Page 12: Devcamp 2017   Microservices Reativos

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

Page 13: Devcamp 2017   Microservices Reativos

Mas porquê Reactive ?

Page 14: Devcamp 2017   Microservices Reativos

Blocking ...

Page 15: Devcamp 2017   Microservices Reativos

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 !

Page 16: Devcamp 2017   Microservices Reativos

Blocking

Total = T1 + T2+ T3

Page 17: Devcamp 2017   Microservices Reativos

Non-Blocking

Total < T1 + T2+ T3

Page 18: Devcamp 2017   Microservices Reativos

Reactive ProgramingParadigma 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)

Page 19: Devcamp 2017   Microservices Reativos

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" *

Page 20: Devcamp 2017   Microservices Reativos

Reactor

"Reactor is a fourth-generation Reactive library for building non-blocking applications on the JVM based on the Reactive Streams Specification"

Page 21: Devcamp 2017   Microservices Reativos

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()

Page 22: Devcamp 2017   Microservices Reativos

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

Page 23: Devcamp 2017   Microservices Reativos

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();

Page 24: Devcamp 2017   Microservices Reativos

Never block a reactive code !

Page 25: Devcamp 2017   Microservices Reativos

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>

Page 26: Devcamp 2017   Microservices Reativos

https://github.com/tiagodolphine/spring5-reactive-playgroundhttps://github.com/tiagodolphine/reactor-playground

Talk is cheap show me the code

Page 27: Devcamp 2017   Microservices Reativos

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

Page 28: Devcamp 2017   Microservices Reativos

Aplicar princícios reactive em microservices !

Page 29: Devcamp 2017   Microservices Reativos

Rapidez de crescimento

Microservices

Escalabilidade

Disponibilidade

Legado

Page 30: Devcamp 2017   Microservices Reativos

2011

Pedidos / Mês

20162013 2014 2015

20k 100k450k

1M

2,8M

3,5M

Page 31: Devcamp 2017   Microservices Reativos

Almoço Jantar

Page 32: Devcamp 2017   Microservices Reativos

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…)

Page 33: Devcamp 2017   Microservices Reativos

Princípios reactive aplicados em microservices

Page 34: Devcamp 2017   Microservices Reativos

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

Page 35: Devcamp 2017   Microservices Reativos

Auto Scaling

ReactorMicroservices

Page 36: Devcamp 2017   Microservices Reativos

Resultados positivos16K 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)

Page 37: Devcamp 2017   Microservices Reativos
Page 38: Devcamp 2017   Microservices Reativos

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

Page 39: Devcamp 2017   Microservices Reativos

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!

Page 40: Devcamp 2017   Microservices Reativos

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

Page 41: Devcamp 2017   Microservices Reativos

Tiago Dolphine

/tiagodolphine

[email protected]

/tiagodolphine

/tiagodolphine