SlideShare uma empresa Scribd logo
1 de 43
Baixar para ler offline
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 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)
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

Mais procurados

Mais procurados (19)

Apresentacao zabbix
Apresentacao zabbixApresentacao zabbix
Apresentacao zabbix
 
Aula 7 - Hands On - Configurando nossa aplicação na AWS com EC2, Elastic Load...
Aula 7 - Hands On - Configurando nossa aplicação na AWS com EC2, Elastic Load...Aula 7 - Hands On - Configurando nossa aplicação na AWS com EC2, Elastic Load...
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
Devops: Gestão e publicação de Dados no SQL ServerDevops: Gestão e publicação de Dados no SQL Server
Devops: Gestão e publicação de Dados no SQL Server
 
Aula 4 - Introdução a aws
Aula 4 - Introdução a awsAula 4 - Introdução a aws
Aula 4 - Introdução a aws
 
JavaEE
JavaEEJavaEE
JavaEE
 
Windows Azure Pack - Visão Geral
Windows Azure Pack - Visão GeralWindows Azure Pack - Visão Geral
Windows Azure Pack - Visão Geral
 
Migrando Aplicações legadas para o Microsoft Azure
Migrando Aplicações legadas para o Microsoft AzureMigrando Aplicações legadas para o Microsoft Azure
Migrando Aplicações legadas para o Microsoft Azure
 
Aula 6 - EC2, ELB, Auto Scaling, Cloud Watch
Aula 6 - EC2, ELB, Auto Scaling, Cloud WatchAula 6 - EC2, ELB, Auto Scaling, Cloud Watch
Aula 6 - EC2, ELB, Auto Scaling, Cloud Watch
 
SQL over SMB3
SQL over SMB3SQL over SMB3
SQL over SMB3
 
Preparando sua arquitetura para microservicos
Preparando sua arquitetura para microservicosPreparando sua arquitetura para microservicos
Preparando sua arquitetura para microservicos
 
QConSP 2014 - Cassandra no Desenvolvimento de Aplicações para serviços Móveis
QConSP 2014 - Cassandra no Desenvolvimento  de Aplicações para  serviços MóveisQConSP 2014 - Cassandra no Desenvolvimento  de Aplicações para  serviços Móveis
QConSP 2014 - Cassandra no Desenvolvimento de Aplicações para serviços Móveis
 
Introduction to Cloud Computing
Introduction to Cloud ComputingIntroduction to Cloud Computing
Introduction to Cloud Computing
 
Construindo APIs com Amazon API Gateway e AWS Lambda
Construindo APIs com Amazon API Gateway e AWS LambdaConstruindo APIs com Amazon API Gateway e AWS Lambda
Construindo APIs com Amazon API Gateway e AWS Lambda
 
DevTalk 08/2019
DevTalk 08/2019DevTalk 08/2019
DevTalk 08/2019
 
Aula 8 - Comunicação entre Componentes com SQS e SNS
Aula 8 - Comunicação entre Componentes com SQS e SNSAula 8 - Comunicação entre Componentes com SQS e SNS
Aula 8 - Comunicação entre Componentes com SQS e SNS
 
Azure Stack | Visão Geral
Azure Stack | Visão GeralAzure Stack | Visão Geral
Azure Stack | Visão Geral
 
Webinar: Como obter valor comercial com Big Data
Webinar: Como obter valor comercial com Big DataWebinar: Como obter valor comercial com Big Data
Webinar: Como obter valor comercial com Big Data
 
Apresentação do Curso
Apresentação do CursoApresentação do Curso
Apresentação do Curso
 
DevOps - melhores práticas e integração contínua
DevOps - melhores práticas e integração contínuaDevOps - melhores práticas e integração contínua
DevOps - melhores práticas e integração contínua
 

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

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

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

Último

Assessement Boas Praticas em Kubernetes.pdf
Assessement Boas Praticas em Kubernetes.pdfAssessement Boas Praticas em Kubernetes.pdf
Assessement Boas Praticas em Kubernetes.pdf
Natalia Granato
 

Último (6)

ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 
Assessement Boas Praticas em Kubernetes.pdf
Assessement Boas Praticas em Kubernetes.pdfAssessement Boas Praticas em Kubernetes.pdf
Assessement Boas Praticas em Kubernetes.pdf
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 

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...
  • 6.
  • 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)
  • 39.
  • 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