Conceitos Fundamentais do RabbitMQ

AMQP

O Advanced Message Queue Protocol (AMQP) é um padrão aberto de protocolo de camada de aplicativo, projetado para middlewares orientados a mensagens. Ele permite a comunicação entre clientes e sistemas de mensagens de forma independente do produto ou linguagem de desenvolvimento.

Modelo de Mensagens

O processo abstrato é comum a todos os produtos de MQ: um consumidor se inscreve em uma fila. Um produtor gera uma mensagem e a publica em uma fila, que então a encaminha para os consumidores conectados.

Conceitos Básicos

  1. Broker: A entidade do servidor de mensagens, por exemplo, uma instância do RabbitMQ.
  2. Virtual Host (vhost): Um mini servidor RabbitMQ independente, com suas próprias filas, trocas, ligações e sistema de permissões. Deve ser especificado na conexão; o padrão é /. Em URIs, use %2F para representar /.
  3. Connection: Uma conexão TCP com o broker.
  4. Channel: Um caminho de comunicação virtual dentro de uma conexão TCP, permitindo múltiplas operações concorrentes com baixo overhead.
  5. Message: Consiste em um cabeçalho (com atributos como chave de roteamento, prioridade, modo de entrega) e um corpo opaco.
  6. Publisher: A aplicação cliente que produz e publica mensagens para uma troca (exchange).
  7. Consumer: A aplicação cliente que recebe mensagens de uma fila.
  8. Exchange: Recebe mensagens dos produtores e as roteia para uma ou mais filas com base em regras.
  9. Routing Key: Uma chave usada pela troca para rotear mensagens para as filas. O uso de curingas (#, *) é permitido apenas no modo topic.
  10. Queue: O armazenamento que mantém as mensagens até serem entregues aos consumidores.

Tipos de Exchange

Fanout

Distribui mensagens para todas as filas ligadas a ela, ignorando a chave de roteamento. Funciona como um broadcast.

Direct

Encaminha a mensagem para filas onde a chave de ligação (binding key) corresponde exatamente à chave de roteamento da mensagem.

Topic

Roteia com base em correspondência de padrões. A chave de roteamento e a chave de ligação são comparadas usando palavras separadas por pontos. Aceita os curingas: * (uma palavra) e # (zero ou mais palavras).

Cluster RabbitMQ

O RabbitMQ oferece um sistema de clustering integrado para alta disponibilidade e escalabilidade, baseado no framework OTP do Erlang.

Conceitos Relacionados

  • Metadados: Incluem informações sobre filas, trocas, ligações e vhosts.
  • Nó de Disco: Um nó que persiste metadados no armazenamento. O cluster requer pelo menos um nó de disco.

Modos do Cluster

  1. Modo Padrão (Não-Espelhado): As mensagens residem fisicamente apenas no nó ao qual a fila foi declarada. Outros nós atuam como roteadores, o que pode causar gargalos.
  2. Modo Espelhado: Cria cópias (réplicas) das filas em múltiplos nós. Oferece alta disponibilidade, pois as mensagens são sincronizadas proativamente entre os espelhos. Pode impactar o desempenho e o consumo de rede.

Implantação com Docker (Exemplo)

O exemplo a seguir demonstra a criação de um cluster de três nós usando containers Docker.

1. Obter a Imagem

docker pull rabbitmq:3.9.7-management

2. Executar os Containers

docker run -d --hostname mq_host1 --name container_mq1 -p 15672:15672 -p 5672:5672 -e RABBITMQ_ERLANG_COOKIE='meu_cookie_secreto' rabbitmq:3.9.7-management
docker run -d --hostname mq_host2 --name container_mq2 -p 5673:5672 --link container_mq1:mq_host1 -e RABBITMQ_ERLANG_COOKIE='meu_cookie_secreto' rabbitmq:3.9.7-management
docker run -d --hostname mq_host3 --name container_mq3 -p 5674:5672 --link container_mq1:mq_host1 --link container_mq2:mq_host2 -e RABBITMQ_ERLANG_COOKIE='meu_cookie_secreto' rabbitmq:3.9.7-management

Parâmetros importantes:
-p: Mapeia portas (gestão: 15672, AMQP: 5672).
--link: Conecta containers.
RABBITMQ_ERLANG_COOKIE: O valor deve ser idêntico em todos os nós do cluster para autenticação mútua.

Adicione as seguintes linhas ao arquivo de hosts do seu sistema (/etc/hosts ou C:\Windows\System32\drivers\etc\hosts):

127.0.0.1 mq_host1 mq_host2 mq_host3

3. Formar o Cluster

Para o primeiro nó (controller):

docker exec -it container_mq1 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
exit

Para o segundo nó (junção ao cluster):

docker exec -it container_mq2 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@mq_host1
rabbitmqctl start_app
exit

Repita o processo similar para o terceiro nó.

4. Configurar Políticas para Espelhamento

As políticas controlam o comportamento das filas e trocas, como a replicação no modo espelhado.

Exemplo de comando para criar uma política que espelha todas as filas (ha-mode: all):

rabbitmqctl set_policy politica_ha_todos "^" '{"ha-mode":"all"}'

Ao aplicar essa política via gerenciador ou comando, o RabbitMQ sincronizará os dados entre os nós do cluster.

Tags: RabbitMQ AMQP cluster Docker mensagem

Publicado em 8-11 07:26