Arquitetura do RabbitMQ
O RabbitMQ é um sistema de mensageria que segue o padrão AMQP. Seus componentes principais incluem:
- Broker: Servidor central que gerencia o recebimento e a distribuição de mensagens.
- Virtual Host: Ambiente isolado que permite a separação de recursos entre diferentes usuários ou aplicações.
- Connection: Conexão TCP estabelecida entre produtores/consumidores e o broker.
- Channel: Caminho lógico dentro de uma conexão, otimizando o uso de recursos ao compartilhar uma mesma conexão TCP.
- Exchange: Componente intermediário que recebe mensagens e as direciona para filas com base em regras de roteamento.
- Queue: Estrutura que armazena mensagens até serem consumidas por aplicações.
- Binding: Regra que define a relação entre um exchange e uma fila, baseada em chaves de roteamento.
O fluxo básico de uma mensagem envolve: o produtor envia para o broker, que a encaminha via exchange para a fila apropriada, e o consumidor a retira da fila através de um canal.
Instalação e Conifguração
Para instalação, consulte a documentação oficial do RabbitMQ, que oferece opções para ambientes virtuais ou contêineres Docker.
Modos de Cluster
Em um cluster RabbitMQ, os nós podem ser de dois tipos:
- Nó em memória: Armazena dados apenas na RAM, oferecendo maior velocidade de acesso.
- Nó em disco: Armazena dados tanto na RAM quanto no disco, garantidno persistência.
Recomenda-se configurar pelo menos um nó em disco em clusters com três ou mais máquinas para backup de dados.
Os clusters operam em dois modos:
- Modo padrão: Modo inicial após a criação do cluster, com replicação básica de metadados.
- Modo espelho: Cria filas espelho que sincronizam mensagens entre nós, aumentando a disponibilidade e segurança, porém com maior consumo de recursos.
Tipos de Exchange
O RabbitMQ suporta diversos tipos de exchange para roteamento de mensagens:
- Direct Exchange: Encaminha mensagens para filas com base em uma correspondência exata da chave de roteamento.
- Fanout Exchange: Distribui mensagens para todas as filas vinculadas, ignorando chaves de roteamento (modo broadcast).
- Topic Exchange: Roteia mensagens usando padrões nas chaves de roteamento, onde '*' substitui uma palavra e '#' substitui zero ou mais palavras.
- Header Exchange: Faz correspondência baseada nos cabeçalhos da mensagem, em vez de chaves de roteamento.
Gerenciamento
A interface web de gerenciamento está disponível em http://endereço-ip-do-broker:15672, fornecendo ferramentas para monitoramento e configuração via API.
Exemplos Práticos em Python
A seguir, exemplos de código para publicar e consumir mensagens utilizando a biblioteca pika.
Produzindo Mensagens
import pika
# Configuração de credenciais e conexão
credenciais = pika.PlainCredentials('usuario', 'senha_segura')
conexao = pika.BlockingConnection(pika.ConnectionParameters('localhost', 5672, '/', credenciais))
canal = conexao.channel()
# Declarar a fila (cria se não existir)
canal.queue_declare(queue='fila_pedidos')
# Publicar mensagens em um loop
for id_msg in range(500):
conteudo = f'Pedido #{id_msg} - Dados do cliente'
canal.basic_publish(exchange='', routing_key='fila_pedidos', body=conteudo)
print(f'Mensagem {id_msg} enviada para a fila')
conexao.close()
Consumindo Mensagens
import pika
# Configuração de credenciais e conexão
credenciais = pika.PlainCredentials('usuario', 'senha_segura')
conexao = pika.BlockingConnection(pika.ConnectionParameters('localhost', 5672, '/', credenciais))
canal = conexao.channel()
# Declarar a fila
canal.queue_declare(queue='fila_pedidos')
# Função de callback para processar mensagens
def tratar_mensagem(canal, metodo, propriedades, corpo):
print(f'Mensagem recebida: {corpo.decode("utf-8")}')
canal.basic_ack(delivery_tag=metodo.delivery_tag)
# Iniciar consumo
canal.basic_consume(queue='fila_pedidos', on_message_callback=tratar_mensagem)
print('Aguardando mensagens. Pressione Ctrl+C para encerrar.')
canal.start_consuming()
conexao.close()