RabbitMQ: Fundamentos Técnicos e Implementação com Python

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()

Tags: RabbitMQ Python pika MessageBroker VirtualHost

Publicado em 7-11 18:57