43
Microservices Reativos A experiência no Tiago Dolphine

QCon SP 2017 - Reactive Microservices e a experiência do iFood

Embed Size (px)

Citation preview

Page 1: QCon SP 2017 - Reactive Microservices e a experiência do iFood

Microservices Reativos

A experiência no

Tiago Dolphine

Page 2: QCon SP 2017 - Reactive Microservices e a experiência do iFood

Tiago Dolphine

Page 3: QCon SP 2017 - Reactive Microservices e a experiência do iFood

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: QCon SP 2017 - Reactive Microservices e a experiência do iFood

+3MM pedidos / mês

+16K restaurantes ativos

+4MM usuários ativos

+140K requests/min

+200 instâncias em Cloud

Page 5: QCon SP 2017 - Reactive Microservices e a experiência do iFood

Um pouco do passado...

Page 6: QCon SP 2017 - Reactive Microservices e a experiência do iFood
Page 7: QCon SP 2017 - Reactive Microservices e a experiência do iFood

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: QCon SP 2017 - Reactive Microservices e a experiência do iFood

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

Page 9: QCon SP 2017 - Reactive Microservices e a experiência do iFood

Sistemas de software precisam acompanhar esta evolução!

Page 10: QCon SP 2017 - Reactive Microservices e a experiência do iFood

Sistemas de software precisam REAGIR !

Page 11: QCon SP 2017 - Reactive Microservices e a experiência do iFood

Reactive Manifesto (2013… 2014...)

Page 12: QCon SP 2017 - Reactive Microservices e a experiência do iFood

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: QCon SP 2017 - Reactive Microservices e a experiência do iFood

Mas porquê Reactive ?

Page 14: QCon SP 2017 - Reactive Microservices e a experiência do iFood

Blocking ...

Page 15: QCon SP 2017 - Reactive Microservices e a experiência do iFood

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: QCon SP 2017 - Reactive Microservices e a experiência do iFood

Blocking

Total = T1 + T2+ T3

Page 17: QCon SP 2017 - Reactive Microservices e a experiência do iFood

Non-Blocking

Total < T1 + T2+ T3

Page 18: QCon SP 2017 - Reactive Microservices e a experiência do iFood

Sync

Async

Page 19: QCon SP 2017 - Reactive Microservices e a experiência do iFood

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)

Page 20: QCon SP 2017 - Reactive Microservices e a experiência do iFood

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 21: QCon SP 2017 - Reactive Microservices e a experiência do iFood

Reactor

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

Page 22: QCon SP 2017 - Reactive Microservices e a experiência do iFood

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 23: QCon SP 2017 - Reactive Microservices e a experiência do iFood

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 24: QCon SP 2017 - Reactive Microservices e a experiência do iFood

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 25: QCon SP 2017 - Reactive Microservices e a experiência do iFood

Never block a reactive code !

Page 26: QCon SP 2017 - Reactive Microservices e a experiência do iFood

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 27: QCon SP 2017 - Reactive Microservices e a experiência do iFood

Source: Spring Reference Documentation(9)

Page 28: QCon SP 2017 - Reactive Microservices e a experiência do iFood

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

Talk is cheap show me the code

Page 29: QCon SP 2017 - Reactive Microservices e a experiência do iFood

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 30: QCon SP 2017 - Reactive Microservices e a experiência do iFood

Aplicar princícios reactive em microservices !

Page 31: QCon SP 2017 - Reactive Microservices e a experiência do iFood

Rapidez de crescimento

Microservices

Escalabilidade

Disponibilidade

Legado

Page 32: QCon SP 2017 - Reactive Microservices e a experiência do iFood

2011

Pedidos / Mês

20162013 2014 2015

20k 100k450k

1M

2,8M

3,5M

Page 33: QCon SP 2017 - Reactive Microservices e a experiência do iFood

Almoço Jantar

Page 34: QCon SP 2017 - Reactive Microservices e a experiência do iFood

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 35: QCon SP 2017 - Reactive Microservices e a experiência do iFood

Princípios reactive aplicados em microservices

Page 36: QCon SP 2017 - Reactive Microservices e a experiência do iFood

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 37: QCon SP 2017 - Reactive Microservices e a experiência do iFood

Auto Scaling

ReactorMicroservices

Page 38: QCon SP 2017 - Reactive Microservices e a experiência do iFood

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)

Page 39: QCon SP 2017 - Reactive Microservices e a experiência do iFood
Page 40: QCon SP 2017 - Reactive Microservices e a experiência do iFood

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 41: QCon SP 2017 - Reactive Microservices e a experiência do iFood

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 42: QCon SP 2017 - Reactive Microservices e a experiência do iFood

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 43: QCon SP 2017 - Reactive Microservices e a experiência do iFood

Tiago Dolphine

/tiagodolphine

[email protected]

/tiagodolphine

/tiagodolphine