SlideShare uma empresa Scribd logo
ESCALANDO E
CONSUMINDO
QUEUES
&
MATHEUS FIDELIS
Desenvolvedor Web DevOps
Twitter: @fidelissauro
Web: http://nanoshots.com.br
Github: https://github.com/msfidelis
O QUE SÃO QUEUES1
O QUE SÃO QUEUES
◦ Lista de itens
◦ FIFO (First In, First Out)
PROCESSAMENTO DE QUEUES
PROCESSAMENTO ASSÍNCRONO DE QUEUES
COMO UMA
QUEUES
AJUDARIAM A
ESCALAR
MINHA API?
NO QUE ISSO ME AJUDA?
◦ Processamento transparente
◦ Desacoplagem de sistemas
◦ Facil integração
◦ Comunicação uniforme
◦ “Deixa comigo e segue teu caminho”
“
HISTORIA DE DESACOPLAMENTO
(3,2 s)
{
NOME: JOÃO
PRODUTOS: {
{
item: geladeira,
valor: 1200.00
}
},
cc : {
numero: 123123123,
cvv: 123123
validade 01/08/2028
}
}
{status : 200}
“
HISTORIA DE DESACOPLAMENTO
(3,2 s)
{status : 200}
“
HISTORIA DE DESACOPLAMENTO
(3,5 s)
(5,9 s)
(4,3 s)
(3,2 s)
“
HISTORIA DE DESACOPLAMENTO
{status : 200}
“
HISTORIA DE DESACOPLAMENT
(20 ms)
{status : 200}
QUE LINGUA ISSO FALA?3
QUE LINGUA ISSO FALA?
◦ AMQP
▫ (Mais) Um protocolo de comunicação em rede
▫ Cria um canal virtual dentro de uma conexão
TCP
▫ TCP é custoso e demorado e limitado.
▫ Canais virtuais dentro do TCP ilimitados.
▫ Muitas threads compartilham a mesma conexão
TCP
ARQUITETURA DO AMQP
◦ Publishers e Consumers
◦ Exchanges: Onde os Publishers publicam
as mensagens
◦ Routes ou Bindings: Padrões que
definem a Queue destino da mensagem.
◦ Queue: Armazena as mensagens que vão
ser consumidas pelos Consumers.
ARQUITETURA DO AMQP
MENSAGENS PARA O EXCHANGES
◦ Payload: Corpo da mensagem. Pode ser
um JSON, um XML, uma imagem, um
vídeo, uma string e etc
◦ Label: Header que descreve o Payload e
pra onde ele vai ser enviado (Queue)
CONSUMERS E QUEUES
◦ Classico Round-Robin
◦ A queue envia a mensagem para um
consumer.
◦ O consumer pega a mensagem e envia o
sucesso do recebimento/execução (ACK).
◦ O servidor apaga a mensagem da fila
◦ Em caso de erro, ou sem ACK, o servidor
retorna para distribuição.
RABBITMQ
Uma mão na roda na gestão de Queues
em pequena, média e larga escala.
QUE LINGUA ISSO FALA?
◦ RabbitMQ
▫ É um servidor de mensagens
▫ Suporte a AMQP
▫ Escrito em Erlang
▫ Open Source
▫ Minimalista
▫ Possibilidade de Distribuição
▫ API
▫ CLI
▫ Web UI
https://www.rabbitmq.com/
“
CRIANDO UMA CONEXÃO COM O RABBITMQ
$ npm install amqplib --save
http://www.squaremobius.net/amqp.node/channel_api.html
“
CRIANDO UMA CONEXÃO COM O RABBITMQ
“
ENVIANDO UMA MENSAGEM SIMPLES
“
ENVIANDO UMA MENSAGEM SIMPLES
“
ENVIANDO UMA MENSAGEM SIMPLES
“
CONSUMINDO UMA MENSAGEM SIMPLES
“
CONSUMINDO UMA MENSAGEM SIMPLES
“
ENVIANDO VÁRIAS MENSAGENS - SIMULANDO CLIENTES
“
CONSUMINDO VÁRIAS MENSAGENS - SIMULANDO PROCESSAMENTO
ESCALANDO
Como os Containers ajudam a escalar
nossos consumers conforme a demanda
ESCALANDO CONTAINERS DE CONSUMERS
◦ Escalando sob demanda!
▫ Containers são rápidos
▫ Fácil replicação
▫ Escalar em quantidade horizontalmente
▫ Integração com ambientes de CI & CD
▫ Failover
▫ Poder ser Docker, LXC, Rocket e etc.
▫ Criar vários cenários
Docker
◦ Empacotador de
ambientes
◦ Gerenciador de
Containers LXC
ESCALANDO CONTAINERS DE CONSUMERS
Docker-Compose
◦ Orquestrador de
Containers
Docker
◦ Gerenciamento
Simplista
https://docs.docker.com/
https://docs.docker.com/compose/
“
DOCKERFILE DE BUILD
“
DOCKER COMPOSE COMO ORQUESTRADOR
FAZENDO DEPLOY DA NOSSA STACK
$ docker-compose build
$ docker-compose up
FAZENDO DEPLOY DA NOSSA STACK
$ docker-compose ps
ESCALANDO SOB DEMANDA
ESCALANDO SOB DEMANDA
FAZENDO DEPLOY DA NOSSA STACK
FAZENDO DEPLOY DE 10 CONTAINERS DE CONSUMERS
$ docker-compose scale consumer=10
FAZENDO DEPLOY DE 10 CONTAINERS DE CONSUMERS
$ docker-compose ps
FAZENDO DEPLOY DE 10 CONTAINERS DE CONSUMERS
OPÇÕES MAIS AVANÇADAS DE ORQUESTRAÇÃO
Docker Swarm
Ferramenta de
criação e
orquestração de
Clusters nativa do
Docker.
Pequena, média e
grande escala.
Google
Kubernetes
Ferramenta para
gerenciamento de
Clusters de
Containers Docker
ou Rocket.
Média, grande e
enorme escala.
Rocket
(Ou RKT)
Ferramenta de
orquestração de
containers e
clusters de
CoreOS.
Média, grande e
enorme escala.
EXEMPLOS
https://github.com/msfidelis/QueuesComNodeEDocker
Obrigado!
PERGUNTAS?
Contato:
@fidelissauro
matheus.fidelis@superlogica.com
msfidelis01@gmail.com
https://github.com/msfidelis
http://nanoshots.com.br

Mais conteúdo relacionado

Mais procurados

Aula 3 - Lógica de Programação
Aula 3 - Lógica de ProgramaçãoAula 3 - Lógica de Programação
Aula 3 - Lógica de Programação
Instituto CENTEC
 
Guia rápido de utilização do Visio 2013
Guia rápido de utilização do Visio 2013Guia rápido de utilização do Visio 2013
Guia rápido de utilização do Visio 2013
Nilton (LOMEUTEC)
 
Princípios SOLID
Princípios SOLIDPrincípios SOLID
Princípios SOLID
Edmilson Filho
 
Introdução a Métodos Ágeis de Desenvolvimento de Software
Introdução a Métodos Ágeis de Desenvolvimento de SoftwareIntrodução a Métodos Ágeis de Desenvolvimento de Software
Introdução a Métodos Ágeis de Desenvolvimento de Software
Daniel Cukier
 
NodeJS - Server Side JS
NodeJS - Server Side JS NodeJS - Server Side JS
NodeJS - Server Side JS
Ganesh Kondal
 
Modelagem Aplicações Web com UML
Modelagem Aplicações Web com UMLModelagem Aplicações Web com UML
Modelagem Aplicações Web com UML
Claudio Martins
 
Testing Rich Domain Models
Testing Rich Domain ModelsTesting Rich Domain Models
Testing Rich Domain Models
Chris Richardson
 
Construindo pipelines com Azure DevOps
Construindo pipelines com Azure DevOpsConstruindo pipelines com Azure DevOps
Construindo pipelines com Azure DevOps
Camila Carrera
 
Aula 02 - Escolha caso
Aula 02 - Escolha casoAula 02 - Escolha caso
Aula 02 - Escolha caso
Eder Samaniego
 
The New JavaScript: ES6
The New JavaScript: ES6The New JavaScript: ES6
The New JavaScript: ES6
Rob Eisenberg
 
Micro services Architecture
Micro services ArchitectureMicro services Architecture
Micro services Architecture
Araf Karsh Hamid
 
MongoDB vs. Postgres Benchmarks
MongoDB vs. Postgres Benchmarks MongoDB vs. Postgres Benchmarks
MongoDB vs. Postgres Benchmarks
EDB
 
DOMinando JavaScript
DOMinando JavaScriptDOMinando JavaScript
DOMinando JavaScript
Thiago Poiani
 
Introduction to microservices
Introduction to microservicesIntroduction to microservices
Introduction to microservices
Anil Allewar
 
Local Testing and Deployment Best Practices for Serverless Applications - AWS...
Local Testing and Deployment Best Practices for Serverless Applications - AWS...Local Testing and Deployment Best Practices for Serverless Applications - AWS...
Local Testing and Deployment Best Practices for Serverless Applications - AWS...
Amazon Web Services
 
서버리스 기반의 프론트엔드 서버 구축(Serverless frontend web server)
서버리스 기반의 프론트엔드 서버 구축(Serverless frontend web server)서버리스 기반의 프론트엔드 서버 구축(Serverless frontend web server)
서버리스 기반의 프론트엔드 서버 구축(Serverless frontend web server)
ChanMin Park
 
Python - Introdução
Python - IntroduçãoPython - Introdução
Python - Introdução
fabiocerqueira
 
Banco de Dados - Transações e Controle de Concorrência
Banco de Dados - Transações e Controle de ConcorrênciaBanco de Dados - Transações e Controle de Concorrência
Banco de Dados - Transações e Controle de Concorrência
Juliano Padilha
 
Enteprise Integration Patterns
Enteprise Integration PatternsEnteprise Integration Patterns
Enteprise Integration Patterns
Alessandro Kieras
 
Domain Driven Design
Domain Driven Design Domain Driven Design
Domain Driven Design
Araf Karsh Hamid
 

Mais procurados (20)

Aula 3 - Lógica de Programação
Aula 3 - Lógica de ProgramaçãoAula 3 - Lógica de Programação
Aula 3 - Lógica de Programação
 
Guia rápido de utilização do Visio 2013
Guia rápido de utilização do Visio 2013Guia rápido de utilização do Visio 2013
Guia rápido de utilização do Visio 2013
 
Princípios SOLID
Princípios SOLIDPrincípios SOLID
Princípios SOLID
 
Introdução a Métodos Ágeis de Desenvolvimento de Software
Introdução a Métodos Ágeis de Desenvolvimento de SoftwareIntrodução a Métodos Ágeis de Desenvolvimento de Software
Introdução a Métodos Ágeis de Desenvolvimento de Software
 
NodeJS - Server Side JS
NodeJS - Server Side JS NodeJS - Server Side JS
NodeJS - Server Side JS
 
Modelagem Aplicações Web com UML
Modelagem Aplicações Web com UMLModelagem Aplicações Web com UML
Modelagem Aplicações Web com UML
 
Testing Rich Domain Models
Testing Rich Domain ModelsTesting Rich Domain Models
Testing Rich Domain Models
 
Construindo pipelines com Azure DevOps
Construindo pipelines com Azure DevOpsConstruindo pipelines com Azure DevOps
Construindo pipelines com Azure DevOps
 
Aula 02 - Escolha caso
Aula 02 - Escolha casoAula 02 - Escolha caso
Aula 02 - Escolha caso
 
The New JavaScript: ES6
The New JavaScript: ES6The New JavaScript: ES6
The New JavaScript: ES6
 
Micro services Architecture
Micro services ArchitectureMicro services Architecture
Micro services Architecture
 
MongoDB vs. Postgres Benchmarks
MongoDB vs. Postgres Benchmarks MongoDB vs. Postgres Benchmarks
MongoDB vs. Postgres Benchmarks
 
DOMinando JavaScript
DOMinando JavaScriptDOMinando JavaScript
DOMinando JavaScript
 
Introduction to microservices
Introduction to microservicesIntroduction to microservices
Introduction to microservices
 
Local Testing and Deployment Best Practices for Serverless Applications - AWS...
Local Testing and Deployment Best Practices for Serverless Applications - AWS...Local Testing and Deployment Best Practices for Serverless Applications - AWS...
Local Testing and Deployment Best Practices for Serverless Applications - AWS...
 
서버리스 기반의 프론트엔드 서버 구축(Serverless frontend web server)
서버리스 기반의 프론트엔드 서버 구축(Serverless frontend web server)서버리스 기반의 프론트엔드 서버 구축(Serverless frontend web server)
서버리스 기반의 프론트엔드 서버 구축(Serverless frontend web server)
 
Python - Introdução
Python - IntroduçãoPython - Introdução
Python - Introdução
 
Banco de Dados - Transações e Controle de Concorrência
Banco de Dados - Transações e Controle de ConcorrênciaBanco de Dados - Transações e Controle de Concorrência
Banco de Dados - Transações e Controle de Concorrência
 
Enteprise Integration Patterns
Enteprise Integration PatternsEnteprise Integration Patterns
Enteprise Integration Patterns
 
Domain Driven Design
Domain Driven Design Domain Driven Design
Domain Driven Design
 

Destaque

Docker para maiores
Docker para maioresDocker para maiores
Docker para maiores
Matheus Fidelis
 
Certificado de palestra proferida: "O Inimigo Interno"
Certificado de palestra proferida: "O Inimigo Interno"Certificado de palestra proferida: "O Inimigo Interno"
Certificado de palestra proferida: "O Inimigo Interno"
Ricardo Maganhati Junior
 
Desmistificando a Amazon AWS
Desmistificando a Amazon AWSDesmistificando a Amazon AWS
Desmistificando a Amazon AWS
Matheus Fidelis
 
O Fantástico Mundo de Git
O Fantástico Mundo de GitO Fantástico Mundo de Git
O Fantástico Mundo de Git
Matheus Fidelis
 
Slide pronto
Slide prontoSlide pronto
Slide pronto
Bia Bernardino
 
Slides prontos
Slides prontosSlides prontos
Slides prontos
niceoliveira
 
Slides para Apresentação acadêmica
Slides para Apresentação acadêmicaSlides para Apresentação acadêmica
Slides para Apresentação acadêmica
RafaelBorges3
 
Apresentação de slides pronto
Apresentação de slides prontoApresentação de slides pronto
Apresentação de slides pronto
candidacbertao
 
Web scraping com python
Web scraping com pythonWeb scraping com python
Web scraping com python
Matheus Fidelis
 

Destaque (9)

Docker para maiores
Docker para maioresDocker para maiores
Docker para maiores
 
Certificado de palestra proferida: "O Inimigo Interno"
Certificado de palestra proferida: "O Inimigo Interno"Certificado de palestra proferida: "O Inimigo Interno"
Certificado de palestra proferida: "O Inimigo Interno"
 
Desmistificando a Amazon AWS
Desmistificando a Amazon AWSDesmistificando a Amazon AWS
Desmistificando a Amazon AWS
 
O Fantástico Mundo de Git
O Fantástico Mundo de GitO Fantástico Mundo de Git
O Fantástico Mundo de Git
 
Slide pronto
Slide prontoSlide pronto
Slide pronto
 
Slides prontos
Slides prontosSlides prontos
Slides prontos
 
Slides para Apresentação acadêmica
Slides para Apresentação acadêmicaSlides para Apresentação acadêmica
Slides para Apresentação acadêmica
 
Apresentação de slides pronto
Apresentação de slides prontoApresentação de slides pronto
Apresentação de slides pronto
 
Web scraping com python
Web scraping com pythonWeb scraping com python
Web scraping com python
 

Semelhante a Escalando API's com NodeJS, Docker e RabbitMQ

DevTalk 08/2019
DevTalk 08/2019DevTalk 08/2019
DevTalk 08/2019
Leandro Silva
 
Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2
PrinceGuru MS
 
PHP with Service BUS (RabbitMQ/Redis/MongoDB) - IMasters PHP Experience 2016
PHP with Service BUS (RabbitMQ/Redis/MongoDB) - IMasters PHP Experience 2016PHP with Service BUS (RabbitMQ/Redis/MongoDB) - IMasters PHP Experience 2016
PHP with Service BUS (RabbitMQ/Redis/MongoDB) - IMasters PHP Experience 2016
Alexandre Brandão Lustosa
 
APIs do Jeito Certo
APIs do Jeito CertoAPIs do Jeito Certo
APIs do Jeito Certo
Ravan Scafi
 
Criando Webservice REST com NodeJS, NoSQL & Docker
Criando Webservice REST com NodeJS, NoSQL & DockerCriando Webservice REST com NodeJS, NoSQL & Docker
Criando Webservice REST com NodeJS, NoSQL & Docker
Giovanni Kenji Shiroma
 
Escalando para os primeiros 10 milhões de usuários
Escalando para os primeiros 10 milhões de usuáriosEscalando para os primeiros 10 milhões de usuários
Escalando para os primeiros 10 milhões de usuários
Amazon Web Services LATAM
 
Webinar Melhores práticas e lições aprendidas com aplicações sem servidor
Webinar Melhores práticas e lições aprendidas com aplicações sem servidorWebinar Melhores práticas e lições aprendidas com aplicações sem servidor
Webinar Melhores práticas e lições aprendidas com aplicações sem servidor
Amazon Web Services LATAM
 
PHP Jedi - Boas Práticas e Alta Performance
PHP Jedi - Boas Práticas e Alta PerformancePHP Jedi - Boas Práticas e Alta Performance
PHP Jedi - Boas Práticas e Alta Performance
Felipe Ribeiro
 
Filosofia Ruby e Rails (UFOP e Inforuso 2010)
Filosofia Ruby e Rails (UFOP e Inforuso 2010)Filosofia Ruby e Rails (UFOP e Inforuso 2010)
Filosofia Ruby e Rails (UFOP e Inforuso 2010)
Daniel Lopes
 
Segurança e automação na Amazon: Lições das trincheiras
Segurança e automação na Amazon: Lições das trincheirasSegurança e automação na Amazon: Lições das trincheiras
Segurança e automação na Amazon: Lições das trincheiras
Bruno Luiz Pereira da Silva
 
Construindo um sistema distribuido usando rest
Construindo um sistema distribuido usando restConstruindo um sistema distribuido usando rest
Construindo um sistema distribuido usando rest
David Robert Camargo de Campos
 
Redis um banco chave valor
Redis um banco chave valorRedis um banco chave valor
Redis um banco chave valor
Kinn Julião
 
Meetup Stoodi Data & Tech #3 - Data Pipelines na AWS
Meetup Stoodi Data & Tech #3 - Data Pipelines na AWSMeetup Stoodi Data & Tech #3 - Data Pipelines na AWS
Meetup Stoodi Data & Tech #3 - Data Pipelines na AWS
Alexsandro Francisco dos Santos
 
Clusterização de Aplicações PHP
Clusterização de Aplicações PHPClusterização de Aplicações PHP
Clusterização de Aplicações PHP
ECRAYON Tecnologia Criativa
 
ClusterizaçãO De AplicaçõEs Php
ClusterizaçãO De AplicaçõEs PhpClusterizaçãO De AplicaçõEs Php
ClusterizaçãO De AplicaçõEs Php
Campus Party Brasil
 
Ecossistema Ruby e Rails (Serpro BH)
Ecossistema Ruby e Rails (Serpro BH)Ecossistema Ruby e Rails (Serpro BH)
Ecossistema Ruby e Rails (Serpro BH)
Daniel Lopes
 
Plack
PlackPlack
Plack
Pedro Melo
 
“Web Spiders” – Automação para Web Hacking
“Web Spiders” – Automação para Web Hacking“Web Spiders” – Automação para Web Hacking
“Web Spiders” – Automação para Web Hacking
Conviso Application Security
 
Aws sao paulo summit 2015 elasti cache avancado
Aws sao paulo summit 2015   elasti cache avancadoAws sao paulo summit 2015   elasti cache avancado
Aws sao paulo summit 2015 elasti cache avancado
Amazon Web Services LATAM
 
WebAssembly além da Web - Casos de Uso em IoT
WebAssembly além da Web - Casos de Uso em IoTWebAssembly além da Web - Casos de Uso em IoT
WebAssembly além da Web - Casos de Uso em IoT
GDGFoz
 

Semelhante a Escalando API's com NodeJS, Docker e RabbitMQ (20)

DevTalk 08/2019
DevTalk 08/2019DevTalk 08/2019
DevTalk 08/2019
 
Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2Phpjedi 090307090434-phpapp01 2
Phpjedi 090307090434-phpapp01 2
 
PHP with Service BUS (RabbitMQ/Redis/MongoDB) - IMasters PHP Experience 2016
PHP with Service BUS (RabbitMQ/Redis/MongoDB) - IMasters PHP Experience 2016PHP with Service BUS (RabbitMQ/Redis/MongoDB) - IMasters PHP Experience 2016
PHP with Service BUS (RabbitMQ/Redis/MongoDB) - IMasters PHP Experience 2016
 
APIs do Jeito Certo
APIs do Jeito CertoAPIs do Jeito Certo
APIs do Jeito Certo
 
Criando Webservice REST com NodeJS, NoSQL & Docker
Criando Webservice REST com NodeJS, NoSQL & DockerCriando Webservice REST com NodeJS, NoSQL & Docker
Criando Webservice REST com NodeJS, NoSQL & Docker
 
Escalando para os primeiros 10 milhões de usuários
Escalando para os primeiros 10 milhões de usuáriosEscalando para os primeiros 10 milhões de usuários
Escalando para os primeiros 10 milhões de usuários
 
Webinar Melhores práticas e lições aprendidas com aplicações sem servidor
Webinar Melhores práticas e lições aprendidas com aplicações sem servidorWebinar Melhores práticas e lições aprendidas com aplicações sem servidor
Webinar Melhores práticas e lições aprendidas com aplicações sem servidor
 
PHP Jedi - Boas Práticas e Alta Performance
PHP Jedi - Boas Práticas e Alta PerformancePHP Jedi - Boas Práticas e Alta Performance
PHP Jedi - Boas Práticas e Alta Performance
 
Filosofia Ruby e Rails (UFOP e Inforuso 2010)
Filosofia Ruby e Rails (UFOP e Inforuso 2010)Filosofia Ruby e Rails (UFOP e Inforuso 2010)
Filosofia Ruby e Rails (UFOP e Inforuso 2010)
 
Segurança e automação na Amazon: Lições das trincheiras
Segurança e automação na Amazon: Lições das trincheirasSegurança e automação na Amazon: Lições das trincheiras
Segurança e automação na Amazon: Lições das trincheiras
 
Construindo um sistema distribuido usando rest
Construindo um sistema distribuido usando restConstruindo um sistema distribuido usando rest
Construindo um sistema distribuido usando rest
 
Redis um banco chave valor
Redis um banco chave valorRedis um banco chave valor
Redis um banco chave valor
 
Meetup Stoodi Data & Tech #3 - Data Pipelines na AWS
Meetup Stoodi Data & Tech #3 - Data Pipelines na AWSMeetup Stoodi Data & Tech #3 - Data Pipelines na AWS
Meetup Stoodi Data & Tech #3 - Data Pipelines na AWS
 
Clusterização de Aplicações PHP
Clusterização de Aplicações PHPClusterização de Aplicações PHP
Clusterização de Aplicações PHP
 
ClusterizaçãO De AplicaçõEs Php
ClusterizaçãO De AplicaçõEs PhpClusterizaçãO De AplicaçõEs Php
ClusterizaçãO De AplicaçõEs Php
 
Ecossistema Ruby e Rails (Serpro BH)
Ecossistema Ruby e Rails (Serpro BH)Ecossistema Ruby e Rails (Serpro BH)
Ecossistema Ruby e Rails (Serpro BH)
 
Plack
PlackPlack
Plack
 
“Web Spiders” – Automação para Web Hacking
“Web Spiders” – Automação para Web Hacking“Web Spiders” – Automação para Web Hacking
“Web Spiders” – Automação para Web Hacking
 
Aws sao paulo summit 2015 elasti cache avancado
Aws sao paulo summit 2015   elasti cache avancadoAws sao paulo summit 2015   elasti cache avancado
Aws sao paulo summit 2015 elasti cache avancado
 
WebAssembly além da Web - Casos de Uso em IoT
WebAssembly além da Web - Casos de Uso em IoTWebAssembly além da Web - Casos de Uso em IoT
WebAssembly além da Web - Casos de Uso em IoT
 

Mais de Matheus Fidelis

Road to serverless
Road to serverlessRoad to serverless
Road to serverless
Matheus Fidelis
 
Criando API's com HapiJS
Criando API's com HapiJSCriando API's com HapiJS
Criando API's com HapiJS
Matheus Fidelis
 
Desbravando o REST com Python
Desbravando o REST com PythonDesbravando o REST com Python
Desbravando o REST com Python
Matheus Fidelis
 
Docker Para Maiores - GDG Cabreúva
Docker Para Maiores - GDG CabreúvaDocker Para Maiores - GDG Cabreúva
Docker Para Maiores - GDG Cabreúva
Matheus Fidelis
 
Introdução a Containers Docker
Introdução a Containers DockerIntrodução a Containers Docker
Introdução a Containers Docker
Matheus Fidelis
 
Aula 1 - Testando a Segurança de Sua Aplicação Web
Aula 1 - Testando a Segurança de Sua Aplicação WebAula 1 - Testando a Segurança de Sua Aplicação Web
Aula 1 - Testando a Segurança de Sua Aplicação Web
Matheus Fidelis
 

Mais de Matheus Fidelis (6)

Road to serverless
Road to serverlessRoad to serverless
Road to serverless
 
Criando API's com HapiJS
Criando API's com HapiJSCriando API's com HapiJS
Criando API's com HapiJS
 
Desbravando o REST com Python
Desbravando o REST com PythonDesbravando o REST com Python
Desbravando o REST com Python
 
Docker Para Maiores - GDG Cabreúva
Docker Para Maiores - GDG CabreúvaDocker Para Maiores - GDG Cabreúva
Docker Para Maiores - GDG Cabreúva
 
Introdução a Containers Docker
Introdução a Containers DockerIntrodução a Containers Docker
Introdução a Containers Docker
 
Aula 1 - Testando a Segurança de Sua Aplicação Web
Aula 1 - Testando a Segurança de Sua Aplicação WebAula 1 - Testando a Segurança de Sua Aplicação Web
Aula 1 - Testando a Segurança de Sua Aplicação Web
 

Escalando API's com NodeJS, Docker e RabbitMQ

Notas do Editor

  1. De modo grotesco as Queues são uma lista de dados enfileirados por ordem de alocação. Literalmente é como uma fila de lotérica (sem preferencial), onde o primeiro que chega é o primeiro a ser atendido e sair da fila, e assim o segundo, terceiro, quarto e consecutivamente.
  2. De um modo mais básico, o processamento de queues, ou fila, se consiste em requisitar itens alocados na mesma, um a um, para serem processados um a um por um ou mais destinatários, que respondem pra essa fila se a mensagem foi processada com exito ou não.
  3. Da mesma forma ocorre no processamento assíncrono de Queues, onde basicamente temos vários clientes que enviam mensagens para nosso Message Storage e vários clientes conectados a nossa queue pegando e consumindo de maneira assíncrona todos os itens assim que estiverem preparados para serem disponibilizados em um pool de mensagens.
  4. Então beleza, entendi o conceito grotesco de filas. Mas como essa paradinha vai me ajudar a escalar minha aplicação, API, Web Service? Como isso me ajuda, e quais as vantagens que um processamento de mensagens vai trazer pra mim e pro meu cliente?
  5. Quando nós falamos de Queues em web apps e api`s, estamos falando de uma das maiores sacadas no conceito de arquitetura e backend.Você pode enviar strings, JSON, parâmetros para as filas e escalar a responsabilidade de leitura e processamento dessas mensagens para outros microsservicos, crons ou módulos do seu seu ecossistemas. Inclusive integrar aplicações feitas em diferentes linguagens, respeitando diferentes paradigmas provendo uma comunicação uniforme entre eles. Simplesmente ter um serviço que está preopado simplesmente em enviar algo pra lá sem precisar se preocupar onde, quando e por quem aqueles dados enviados vão ser processados.
  6. Bom, num exemplo mais claro, imaginem que vocês tem uma aplicação responsável por receber uma solicitação de compra de clientes. Esse cliente vai te enviar todos os dados os produtos junto as informações do seu cartão de crédito. Sua aplicação faz o trabalho dela. Ela recebe esses dados, verifica a disponibilidade em estoque, congela os itens, pega os dados do cartão, valida a integridade dos mesmos, valida com um retorno da adquirente, verifica o limite disponível, calcula o valor dos itens, do frente, registra a compra, atualiza as informações de estoque, envia e-mail, e depois devolve uma resposta pro cliente. Em toda essa volta, no melhor dos casos nós pagamos um preço razoável na requisição.
  7. E esse preço ele é pago pelo cliente que integra com a nossa API, ou consome no nosso e-commerce e etc. Tudo isso pra receber uma resposta. O tempo que ele aguarda é vivo, é doloroso dependendo dos casos. Podendo deixar pessoas extremamente putas e insatisfeitas.
  8. E pensando que nossa aplicação possa parar de atender 5, 6 clientes para passar a atender centenas, milhares, esse preço de processamento pode, e vai aumentar, gerando uma insatisfação maior ainda para os usuários da nossa API ou Aplicação.
  9. Pra isso nós utilizamos serviços de mensageria, onde o nosso endpoint da aplicação vai ser responsável somente por receber a solicitação, que seja validar alguns itens mínimos e jogar em um servidor de queues, onde podem haver um ou mais `minions`, `workers` ou `consumidores` esperando para pegar essas mensagens por ordem de chegada e processá-las uma a uma.
  10. Nesse case simples nós conseguimos deixar todo o nosso trabalho sujo transparente para o usuário, onde o mesmo vai receber um “Ow, ok! Recebi sua solicitação. Segue o jogo” E poderá esperar por um e-mail de confirmação, ou tentar consultar o resultado do processamento através de outro endpoint da API e etc. Veja como nós conseguimos escalar nossa aplicação de tal forma, que nem nossa aplicação é mais responsável por processar as informações enviadas pra ela.
  11. Beleza, mas onde eu consigo, por onde eu começo e como eu me comunico com um sistema desses pra acoplar isso na minha arquitetura?
  12. Pra isso existe um protocolo legal chamado AMQP. Ele é um protocolo de comunicação de rede muito simples e rápido, que se apropria de uma comunicação TCP, apenas uma, pra criar vários canais virtuais dentro dela. O TCP é um pouco custoso em larga escala, e até mesmo o próprio sistema operacional limita a quantidade de conexões TCP, mas a quantidade de canais virtuais dentro de uma conexão TCP é ilimitada. Então criamos apenas um, ou algumas conexões TCP com o servidor, onde várias threads compartilham dessas conexões para criar vários canais.
  13. A arquitetura do AMQP é razoavelmente simples. E possui dois atores principais (pelo menos), sendo eles os Publishers, que são os responsáveis por publicar itens nas nossas filas, e os Consumers, que vão consumir esses itens um a um. Dentro dessa nossa arquitetura nós temos uma fase chamada Exchanges, ou os pontos de troca, onde os Publishers publicam as mensagens através de um endpoint da API do AMQP. Depois nós ainda temos uma camada chamada de Routes, ou Binginds que vão ler alguns metadados da nossa mensagem e redirecioná-los para sua fila apropriada. E finalmente nossa queue, onde ficam armazenadas nossas mensagens que estão prontas para serem consumidas pelos nossos consumers, workers e etc.
  14. Essa é o fluxo básico do ciclo de vida das mensagens. Onde um publisher envia uma mensagem para a Exchange, que roteia para a Queue destino e é consumida por um ou vários consumers da mesma.
  15. Nossas mensagens enviadas e consumidas também precisam obedecer um padrão minimalista. Onde elas precisam obrigatóriamente ter um payload, ou corpo da mensagem, que pode conter vários tipos de dados, como blobs, strings, objetos JSON, XML’s e etc. E a Label, que vão descrever instruções simples como pra onde a mensagens vai ser encaminhada e etc.
  16. O fluxo de envio também não tem segredo, obedece ao simples conceito de Round and Robin, onde ele vai distribuir igualmente as mensagens para o numero de consumers disponíveis a consumí-las. O consumer solicita, a queue entrega a mensagem, o consumer processa o que precisa ser processado, envia um e-mail, sms, processa a Nota e etc e envia uma requisição de ACK para a queue de sucesso, onde a mesma vai dar como concluido e excluir aquela mensagem, ou um NACK em caso de falha, onde ela vai disponibilizar novamente essa mensagem pra ser consumida na próxima tentativa. Pow, mais essa parada ainda é muito complicada de implementar na mão, o que eu faço?
  17. Pra isso existe uma ferramenta bem bacana chamada RabbitMQ.
  18. O RabbitMQ é um servidor de mensagens que tem suporte para AMQP. Ele é escrito em Erlang ® e é Open Source. Uma ótima solução para quem quer fugir de soluções da IBM, Microsoft, Amazon por exemplo. Ele é extremamente pequeno e rápido e pode rodar em servidores distribuidos. Apesar de ser pequeno ele possui uma API interessante, pode ser gerenciado via CLI ou por uma Web UI bem simples. E possibilita nós criarmos dinamicamente quantas queues quisermos sem nenhuma interação humana.
  19. Essa aqui é a carinha da Web UI do RabbitMQ. Não é nada linda mas é bastante funcional. Da um feedback quase constante dos status das nossas filas e é isso que importa.
  20. Pra fazer a comunicação do Node com o AMQP nós utilizamos uma biblioteca chamada amqplib, o site da documentação é esse.
  21. E pra criar uma conexão também não tem segredo. Essa é a versão mais simples de uma conexão. Onde nós chamamos o amqp.connect, que me responde a uma promisse que vai me retornar um objeto de conexão pra outra promisse que vai me retornar um canal com o servidor. Sem segredo.
  22. Pra enviar uma mensagem também seguimos o mesmo conceito. Nós definimos através no nosso objeto de conexão com o canal o nome da fila, que caso não exista, será criada dinamicamente com o assertQueue() e podemos enviar um buffer pra fila através do parâmetro sentToQueue, onde especificamos a fila e o conteûdo da nossa mensagem, que nessa caso é um JSON que contém algumas informações de e-mail.
  23. A partir do momento que nós rodamos o sender simples, automaticamente o RabbitMQ mostra a nova fila criada e que ea possui uma mensagem pronta para ser consumida.
  24. Pra consumir as mensagem também não tem mistério. Aproveitamos a mesma estrutura de conexão, definimos através do prefetch quantas mensagens vamos pegar por vez. Cuidado aqui, é perigoso. E utilizamos o parâmetro consume para pegar a mensagem que estiver disponível. Em seguida enviamos um ACK ou NOACK pro servidor pra indicar o sucesso do processamento.
  25. Pra consumir as mensagem também não tem mistério. Aproveitamos a mesma estrutura de conexão, definimos através do prefetch quantas mensagens vamos pegar por vez. Cuidado aqui, é perigoso. E utilizamos o parâmetro consume para pegar a mensagem que estiver disponível. Em seguida enviamos um ACK ou NOACK pro servidor pra indicar o sucesso do processamento.
  26. Aqui nós colocamos alguns setInterval pra simular o envio de várias requisições pro servidor. Basicamente servidor como um papel abstrato de clientes que enviam mensagens a todo momento pra nossa fila.
  27. E a mesma coisa pro consumer. Que vai criar uma conexão persistente via AMQP e consumir mensagens assim que estiverem prontas. Aqui eu coloquei um setTimeout pra simular algum processamento real, seja um e-mail, algum faturamento, tratamento de cobranças e etc.
  28. Bom, visto que eu já tenha algum serviço desses rodando no meu ambiente, mas meu processamento aumentou, meu numero de clientes aumentou, meu número de funcionalidades aumentou. Como eu faço pra escalar essas paradas junto a minha demanda? Uma solução simples é utilizando containers pra escalar horizontalmente nosso numero de consumers dentro da nossa máquina ou dentro do nosso clusters dependendo da sua escala.
  29. Beleza, mas por que utilizar containers pra scalar meus atores dentro dos meus workflows? Bom, pela praticidade, pela velocidade, pela capacidade de escalar em numeros altíssimos em pouco tempo. A facilidade de integração com pipelines, e workflows de CI e Container, a gente pensa em Docker pelo Hype, mas container pode ser de qualquer tipo, pode ser um LXC nativo, pode ser via Docker Mesmo, Mesos, Rocket e etc.
  30. Review básicão sobre Docker, não esnder muito sobre o assunto. Docker é um empacotador de ambientes que não faz nada de novo, ele simplesmente gerencia containers de baixo nível do Linux, no caso o LXC, mas de uma maneira muito performática e simples. E pra containerizar e orquestrar nosso ambiente, nós vamos utilizazr um utilitário chamado Docker Compose. Que era nativamente um outro projeto paralelo chamado fig, que foi adotado pela comunidade e agora faz parte do toolbox oficial do Docker como Docker compose. Ele é capaz de empacotar e gerenciar stacks inteiras com inumeros containers e fazer todas as nossas pequenas ‘receitinhas’ dos nossos containers, que seriam as Dockerfiles, virarem um almoço completo.
  31. Pra empacotar nosso serviço eu vou utilizar uma imagem oficial do Node, que já tem ele e várias outras paradinhas legais instaladas nativamente, vou criar nosso Workdir e copiar todo nosso package.json, nosso código em si pra dentro da pasta de trabalho, resolver as dependências do build com o npm e definir um comando de entrada, que seria o node app.js pra startar nossos serviços. Essa dockerfile vai ser utilizada para containerizar tanto nosso agente de sender quanto o de consumer.
  32. Aqui nos temos o arquivo YML lido pelo docker-compose, onde vamos definir todos os parâmetros para o nosso ambiente. Vou utilizar inclusive uma imagem pronta do RabbitMQ, vou definir as variáveis de ambiente do mesmo, como usuário, senha e o vhost eu vou colocar na raiz mesmo. Mapear a porta 8080 da minha máquina pra 15672, que corresponde a porta da WebUI do Rabbit, só pra ficar mais amigável, e mapear a porta 5672, que vai ser a porta do serviço do AMQP em si.
  33. Pra startar um ambiente é simples, basta dar o docker-compose build pra construir os containers e o up pra subir nossa Stack. Caso você nunca tenha realizado o Build antes, no próprio UP ele vai buildar da primeira vez.
  34. Dando um PS nós podemos acompanhar que temos 3 containers rodando, um consumer, um sender e o do rabbitmq
  35. Naquela nossa imagem nós criamos um loop de envio de mensagens. No mundo real, o ato de processar costuma ser muito mais lento que o ato de envio para o rabbitmq, por motivos obvios. Então nosso exemplo seguiu essa linha de raciocinio. Com o passar do tempo, ou do aumento do consumo da nossa aplicação, nossa fila de mensagens pode acabar por se tornar um gargalo também, e receber mais mensagens do qe nosso consumer é capaz de processar por segundo.
  36. Pra isso precisariamos levantar mais workers pra consumir nossas mensagens gargaladas. Com o compose, temos essa opção com o parâmetro Scale. Se você estiver rodando sua stack num cluster de várias máquinas, você pode escalar a níveis estratosféricos, se estiver numa máquina só, é bom contabilizar os recursos antes de sair escalando 10, 20 containers pra realizar essas ações.
  37. De novo com o ps, podemos ver que agora nós temos 10 containers de consumers rodando.
  38. E nossas mensagens começam a ser consumidas num nível maior, acabando com o gargalo e aumentando o processamento das solicitações dos clientes.
  39. Claro que pra larga escala, num ambiente mais Rock n’ Roll, nós não podemos contar apenas com o Compose, pra isso existem várias outras ferramentas para gestão de clusters Docker, como o próprio Swarm que possibilita a criação e gestão de clusters, e é uma solução nativa do Docker. O Kubernetes, da Google que nos permite gerenciar ambientes de complejidades desde médias a escalas absurdas. Tanto que o próprio Google sobrevive de Kubernetes no seu Backend. E o Rocket que utiliza o CoreOS pra criação de clusters de containers. É uma solução muito foda também que vale a pena dar uma estudada.