SlideShare uma empresa Scribd logo
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...
QCon SP 2017 - Reactive Microservices e a experiência do iFood
Programação imperativa
Descrevemos 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"
Reactor
Implementaçã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: main
Number: 2 Thread: main
Number: 4 Thread: main
Number: 6 Thread: main
Number: 8 Thread: main
Number: 10 Thread: main
Number: 12 Thread: main
Number: 14 Thread: main
Number: 16 Thread: main
Number: 18 Thread: main
Number: 4 Thread: parallel-2
Number: 10 Thread: parallel-2
Number: 16 Thread: parallel-2
Number: 0 Thread: parallel-1
Number: 6 Thread: parallel-1
Number: 12 Thread: parallel-1
Number: 18 Thread: parallel-1
Number: 2 Thread: parallel-3
Number: 8 Thread: parallel-3
Number: 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-playground
https://github.com/tiagodolphine/reactor-playground
Talk is cheap show me the code
Reactive Systems
Reatividade 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
100k
450k
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)
QCon SP 2017 - Reactive Microservices e a experiência do iFood
Dificuldades
Debug
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ências
1. 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

Mais conteúdo relacionado

PDF
Microservices reativos e a experiência do iFood
PDF
QCon SP 2016 - WebAPIs e delivery: Matando a fome de 1 milhão de pedidos men...
PPTX
AWS Experience Fortaleza: Escalando sua aplicação Web com Beanstalk
PDF
Microservices
PDF
Segurança e automação na Amazon: Lições das trincheiras
PDF
DevOps, Chef, Puppet, Ansible e como vender milhões na Black Friday com 100% ...
PPTX
Introdução ao AWS Database Migration Service
PDF
Sistema S2DG e Tecnologias Web
Microservices reativos e a experiência do iFood
QCon SP 2016 - WebAPIs e delivery: Matando a fome de 1 milhão de pedidos men...
AWS Experience Fortaleza: Escalando sua aplicação Web com Beanstalk
Microservices
Segurança e automação na Amazon: Lições das trincheiras
DevOps, Chef, Puppet, Ansible e como vender milhões na Black Friday com 100% ...
Introdução ao AWS Database Migration Service
Sistema S2DG e Tecnologias Web

Mais procurados (19)

PPTX
Apresentacao zabbix
ODP
Aula 7 - Hands On - Configurando nossa aplicação na AWS com EC2, Elastic Load...
PPTX
Devops: Gestão e publicação de Dados no SQL Server
PDF
Aula 4 - Introdução a aws
PPT
PPTX
Windows Azure Pack - Visão Geral
PPTX
Migrando Aplicações legadas para o Microsoft Azure
ODP
Aula 6 - EC2, ELB, Auto Scaling, Cloud Watch
PPTX
SQL over SMB3
PDF
Preparando sua arquitetura para microservicos
PDF
QConSP 2014 - Cassandra no Desenvolvimento de Aplicações para serviços Móveis
PDF
Introduction to Cloud Computing
PPTX
Construindo APIs com Amazon API Gateway e AWS Lambda
PPTX
DevTalk 08/2019
PDF
Aula 8 - Comunicação entre Componentes com SQS e SNS
PPTX
Azure Stack | Visão Geral
PDF
Webinar: Como obter valor comercial com Big Data
PDF
Apresentação do Curso
PDF
DevOps - melhores práticas e integração contínua
Apresentacao zabbix
Aula 7 - Hands On - Configurando nossa aplicação na AWS com EC2, Elastic Load...
Devops: Gestão e publicação de Dados no SQL Server
Aula 4 - Introdução a aws
Windows Azure Pack - Visão Geral
Migrando Aplicações legadas para o Microsoft Azure
Aula 6 - EC2, ELB, Auto Scaling, Cloud Watch
SQL over SMB3
Preparando sua arquitetura para microservicos
QConSP 2014 - Cassandra no Desenvolvimento de Aplicações para serviços Móveis
Introduction to Cloud Computing
Construindo APIs com Amazon API Gateway e AWS Lambda
DevTalk 08/2019
Aula 8 - Comunicação entre Componentes com SQS e SNS
Azure Stack | Visão Geral
Webinar: Como obter valor comercial com Big Data
Apresentação do Curso
DevOps - melhores práticas e integração contínua
Anúncio

Semelhante a QCon SP 2017 - Reactive Microservices e a experiência do iFood (20)

PDF
Devcamp 2017 Microservices Reativos
PPTX
TDC2018SP | Trilha Arq .Net - Serverless Reactive Programming on Azure
PDF
Escalabilidade e Resiliência de Microservices em Python
PDF
TDC2018FLN | Trilha Python - Microservices em Python: desafios e soluções
PDF
[DTC21] Thiago Lima - Do Zero ao 100 no Mundo de Microservices
PDF
Vacinando mais de 200 mil pessoas com ReactJS e GraphQL
PDF
Precisamos de um barco maior introdução ao dimensionamento de aplicações
PPT
TDC2016SP - Web Moderna além do Front-End com AngularJS
PDF
Desmistificando a programação reativa
PDF
Projetos reativos com Angular, RxJS e Redux (ngRx)
PDF
Angular + Redux (ngRx)
PDF
Microservices: uma abordagem para arquitetura de aplicações (Devcamp 2015)
PDF
Arquitetura Serverless para Machine Learning
PDF
Desenvolvimento Client-Side 2016
PDF
Containers and microservices orchestration
PDF
Programando interfaces reativas com Xamarin e Reactive UI
PDF
Conhecendo o Ruby on Rails
PPT
Qcon 2013 - Walmart Frontend Solution using Node.js
PDF
Stream Processing - ThoughtWorks Architecture Group - 2017
PPTX
React e reactividade Meetup Facebook Developer Circles
Devcamp 2017 Microservices Reativos
TDC2018SP | Trilha Arq .Net - Serverless Reactive Programming on Azure
Escalabilidade e Resiliência de Microservices em Python
TDC2018FLN | Trilha Python - Microservices em Python: desafios e soluções
[DTC21] Thiago Lima - Do Zero ao 100 no Mundo de Microservices
Vacinando mais de 200 mil pessoas com ReactJS e GraphQL
Precisamos de um barco maior introdução ao dimensionamento de aplicações
TDC2016SP - Web Moderna além do Front-End com AngularJS
Desmistificando a programação reativa
Projetos reativos com Angular, RxJS e Redux (ngRx)
Angular + Redux (ngRx)
Microservices: uma abordagem para arquitetura de aplicações (Devcamp 2015)
Arquitetura Serverless para Machine Learning
Desenvolvimento Client-Side 2016
Containers and microservices orchestration
Programando interfaces reativas com Xamarin e Reactive UI
Conhecendo o Ruby on Rails
Qcon 2013 - Walmart Frontend Solution using Node.js
Stream Processing - ThoughtWorks Architecture Group - 2017
React e reactividade Meetup Facebook Developer Circles
Anúncio

Último (8)

PPTX
Arquitetura de computadores - Memórias Secundárias
PPTX
Como-se-implementa-um-softwareeeeeeeeeeeeeeeeeeeeeeeee.pptx
PDF
Manejo integrado de pragas na cultura do algodão
PPTX
Viasol Energia Solar -Soluções para geração e economia de energia
PPTX
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
PDF
Termos utilizados na designação de relação entre pessoa e uma obra.pdf
PPTX
Mecânico de Manutenção de Equipamentos.pptx
PPTX
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
Arquitetura de computadores - Memórias Secundárias
Como-se-implementa-um-softwareeeeeeeeeeeeeeeeeeeeeeeee.pptx
Manejo integrado de pragas na cultura do algodão
Viasol Energia Solar -Soluções para geração e economia de energia
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
Termos utilizados na designação de relação entre pessoa e uma obra.pdf
Mecânico de Manutenção de Equipamentos.pptx
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx

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

  • 3. 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
  • 4. +3MM pedidos / mês +16K restaurantes ativos +4MM usuários ativos +140K requests/min +200 instâncias em Cloud
  • 5. Um pouco do passado...
  • 7. Programação imperativa Descrevemos 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
  • 8. 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
  • 9. Sistemas de software precisam acompanhar esta evolução!
  • 10. Sistemas de software precisam REAGIR !
  • 12. 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
  • 15. 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 !
  • 19. 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)
  • 20. 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" *
  • 21. Reactor "Reactor is a fourth-generation Reactive library for building non-blocking applications on the JVM based on the Reactive Streams Specification"
  • 22. Reactor Implementaçã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()
  • 23. 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: main Number: 2 Thread: main Number: 4 Thread: main Number: 6 Thread: main Number: 8 Thread: main Number: 10 Thread: main Number: 12 Thread: main Number: 14 Thread: main Number: 16 Thread: main Number: 18 Thread: main
  • 24. Number: 4 Thread: parallel-2 Number: 10 Thread: parallel-2 Number: 16 Thread: parallel-2 Number: 0 Thread: parallel-1 Number: 6 Thread: parallel-1 Number: 12 Thread: parallel-1 Number: 18 Thread: parallel-1 Number: 2 Thread: parallel-3 Number: 8 Thread: parallel-3 Number: 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();
  • 25. Never block a reactive code !
  • 26. 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>
  • 27. Source: Spring Reference Documentation(9)
  • 29. Reactive Systems Reatividade 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
  • 30. Aplicar princícios reactive em microservices !
  • 32. 2011 Pedidos / Mês 20162013 2014 2015 20k 100k 450k 1M 2,8M 3,5M
  • 34. 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…)
  • 35. Princípios reactive aplicados em microservices
  • 36. 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
  • 38. 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)
  • 40. Dificuldades Debug 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
  • 41. 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!
  • 42. Referências 1. 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