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
- Broker: A entidade do servidor de mensagens, por exemplo, uma instância do RabbitMQ.
- 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%2Fpara representar/. - Connection: Uma conexão TCP com o broker.
- Channel: Um caminho de comunicação virtual dentro de uma conexão TCP, permitindo múltiplas operações concorrentes com baixo overhead.
- Message: Consiste em um cabeçalho (com atributos como chave de roteamento, prioridade, modo de entrega) e um corpo opaco.
- Publisher: A aplicação cliente que produz e publica mensagens para uma troca (exchange).
- Consumer: A aplicação cliente que recebe mensagens de uma fila.
- Exchange: Recebe mensagens dos produtores e as roteia para uma ou mais filas com base em regras.
- Routing Key: Uma chave usada pela troca para rotear mensagens para as filas. O uso de curingas (
#,*) é permitido apenas no modotopic. - 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
- 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.
- 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.