Pular para o conteúdo principal

RabbitMQ - Conceitos e Casos de Uso

Olá pessoal hoje iremos falar sobre mensageria utilizando RabbitMQ, iremos passar por conceitos e por alguns casos de uso dessa poderosa ferramenta.


O que é o RabbitMQ

RabbitMQ é um message broker muito utilizado quando falamos de mensageria, é uma ferramenta construída em Erlang, possui drivers para diferentes tecnologias (Java, C#, Golang, etc), além de contar com um grande número de usuários e empresas que a utilizam.

Suas principais características são:
  • Recebimento de mensagens;
  • Resiliência de mensagens;
  • Roteamento de mensagens.


Diferença entre Message Broker e Event Stream

É muito comum vermos discussões sobre Eventos x Mensagem, ou Apache Kafka vs RabbitMQ, mas será que as ferramentas são concorrentes ? Como podemos chegar a uma conclusão ?

Características do RabbitMQ:
  • Possui lógicas para roteamento de mensagens;
  • As mensagens não possuem retenção após o consumo;
  • Mensagens são consumidas apenas uma vez, por Queue;
  • Muito utilizado em regras de negocio que envolvam lógicas complexas;
  • Implementação de regras de DLQ direto no broker.
Características do Apache Kafka:
  • Retenção de eventos;
  • Projetado para altos volumes de dados;
  • Alta escalabilidade;
  • Ordem de consumo por partição;
  • Regras de DLQ deve ser feitas nos consumidores.
Para um exemplo prático, vamos imaginar um cenário onde temos 5 diferentes sistemas que precisam consumir um determinado evento/mensagem, abaixo vamos analisar como seriam as implementações utilizando RabbitMQ e Apache Kafka:

RabbitMQ
No RabbitMQ devemos criar 5 Queues, sendo uma cada consumidor (sistema), também teríamos uma Exchange do tipo Fanout (veremos mais detalhes), onde o produtor envia uma mensagem a Exchange, e esta irá distribuir as mensagens entre todas as Queues.

Apache Kafka
Com Apache Kafka poderíamos ter um único Topic corretamente redimensionado em partições para receber os eventos, e para os sistemas consumidores teríamos Consumer Groups, onde cada sistema pertenceria a um Consumer Group distinto.

Este é apenas um exemplo para ilustrarmos uma forma de atender a um mesmo requisito usando ferramentas com conceitos distintos.

Detalhando o RabbitMQ

Agora vamos passar pelos principais pontos do RabbitMQ, que são os seus componentes internos.

Broker

O broker é uma instância de um serviço RabbitMQ, eles podem trabalhar em um cluster, inclusive essa é uma prática recomendada, porque em casos de falhas em um dos nodes, outros podem continuar trabalhando evitando assim uma indisponibilidade do serviço.

Interface inicial RabbitMQ.

Queue

Com certeza as queues são os itens mais famosos do RabbitMQ,  porque são onde as mensagens são retidas, as mensagens são armazenadas de forma sequencial e as retiramos da mais antiga para a mais nova.

Uma mensagem também pode possuir Headers, estes são importantes no momento do consumo para  identificar qual o tipo de dados estamos lidando.
Interface administrativa para manipular Queues.

Algumas configurações são muito importantes, tais como abaixo:
  •  Durability: Garante que em caso de restart do broker, a Queue continuará existindo;
  • Auto expire:  Quando não estiver sendo utilizada, define por quanto tempo uma Queue ainda ficara ativa antes de ser deletada.

Exchange

Uma Exchange é basicamente um roteamento para onde o produtor envia as mensagens, este contém lógicas que determinam para qual Queue a mensagem será encaminhada, dentro de um Exchange temos alguns itens importantes:
  • Durability: Similar a Queue, garante que em caso de restart do broker, a Exchange continuará existindo;
  • Internal:  Marca um Exchange como uso interno, ou seja, um produtor não pode enviar mensagens para este roteamento;
  • Type: Define o tipo da Exchange (veremos detalhes dos principais tipos).

Interface Administrativa.

Tipos de Exchange

Direct

As Direct são as mais utilizadas e as mais comuns, vamos listar algumas características:
  • Distribuem mensagens para mais de uma Queue;
  • Podem conter regras de distribuição de mensagens (Binding Keys);
  • É o tipo default, em caso de não especificar.

Conforme mencionado, as Binding Keys são configurações que determinam para qual Queue uma mensagem deve ser entregue, isto torna a Exchange similar a um roteador de mensagens, onde as mensagens só serão entregues para quem atenda ao mapeamento, em resumo seria: 

"Quando uma mensagem chegar com a Binding Key X encaminhe a mensagem para a Queue Y".

Exchange envia-notificacao binding com queue_sms e key sms.


Para ilustrar, vamos simular um caso de uso de envio de mensagens, onde temos a necessidade de enviar uma mensagem para um usuário utilizando SMS, E-mail ou Whatsapp, e caso não seja especificado o canal, deve-se mandar por Whatsapp, este caso de uso ficaria da seguinte forma:

Desenho da solução para atender aos requisitos.

Criamos os seguintes componentes:
  • Exchange envia-notificacao do tipo Direct
    • Binding com a Queue: queue_sms
      • Routing Key: sms
    • Binding com a Queue: queue_email
      • Routing Key: email
    • Binding com a Queue: queue_whatsapp
      • Sem Routing
  • Queues queue_sms, queue_emails e queue_whatsapp
Dessa forma temos os cenários de testes cobertos:
  • Caso a mensagem tenha Key sms, a mensagem será entregue a Queue: queue_sms;
  • Caso a mensagem tenha Key email, a mensagem será entregue a Queue: queue_email;
  • Caso a mensagem não tenha uma Key, a mensagem será entregue a Queue: queue_whatsapp.
Aqui conseguimos atender ao caso de uso, utilizando recursos da alguns recursos do tipo Direct.

Fanout

Um outro tipo de Exchange é a Fanout, esta é mais simples que a Direct, porque toda mensagem que chegar deve ser entregue a todas as Queues associadas a Exchange, resumindo seria:

                "Quando chegar uma mensagem encaminhe para todas as Queues associadas".

Como exemplo, vamos analisar um caso de uso de geração de pedidos, temos a necessidade que ao gerar um novo um pedido, os microsserviços de estoque e pagamentos sejam notificados, portanto, teríamos o seguinte desenho:

Desenho da solução para atender aos requisitos.

Criamos os seguintes componentes:
  • Exchange gerar-pedidos do tipo Fanout
    • Binding com a Queue: queue_estoque
    • Binding com a Queue: queue_pagamentos
  • Queues  queue_estoque e queue_pagamentos
Quando chegar uma mensagem na Exchange(Fanout) gerar-pedidos, a mensagem será distribuída a todos as Queues associadas (queue_estoque e queue_pagamentos), portanto, os microsserviços que as consomem receberiam as mensagens contendo os dados do novo pedido, atendendo assim ao requisitos propostos.
 

Ferramentas para RabbitMQ

RabbitMQ Simulator

RabbitMQ Simulator é uma ferramenta online que permite modelar sua arquitetura de mensagens e validar seu funcionamento, com ela podemos simular um cenário completo envolvendo Queues, Exchanges, Consumer, Producers, Keys, etc.



Executando o RabbitMQ

A Instalação do RabbitMQ é tranquila, caso queria executar da maneira convencional, basta seguir as instruções do site oficial, ou também podemos utilizar Docker/Docker-compose como abaixo:

version: '3.7'

services:
  rabbitmq:
    image: rabbitmq:3-management
    ports: 
      - 15672:15672
      - 5672:5672
    environment:
      RABBITMQ_DEFAULT_USER: admin
      RABBITMQ_DEFAULT_PASS: admin
    networks: 
      - rabbitmq

networks:
  rabbitmq:
docker-compose.yml

Para executar basta realizar o seguinte comando:

docker-compose up -d

Outras Ferramentas

As Ferramentas que lidam com mensagens ou eventos, se tornaram muito populares nos dias atuais, isto se deve a evolução das arquiteturas (Microservices, BigData, etc), e também a problemas complexos como Escalabilidade, Performance, Acoplamento, Comunicação, entre outros.

Abaixo vamos listar algumas opções de ferramentas que lidam com mensagens e eventos, vale ressaltar que escolher a ferramenta correta não é uma tarefa simples, mas podemos partir dos pontos abaixo:
  • Entendimento do negocio;
  • Entendimento do problema;
  • Testes das ferramentas;
  • Requisitos não funcionais;
  • Suporte;
  • Comunidade/profissionais que tenham domínio;
  • Custos.
Ferramentas disponíveis:




Comentários

Postagens mais visitadas do Blog