Neste artigo, vamos mostrar como funciona o RabbitMQ. Afinal, RabbitMQ é um sistema de mensageria open-source que implementa o protocolo Advanced Message Queuing Protocol (AMQP). Ele é amplamente utilizado para facilitar a comunicação assíncrona entre diferentes sistemas, permitindo, assim, o envio e recebimento de mensagens de maneira eficiente e escalável.
Conceitos
Primeiramente, precisamos compreender alguns conceitos para entender como funciona o RabbitMQ.
- Produtor é uma aplicação que envia mensagens para o RabbitMQ.
- Exchange recebe mensagens de produtores e roteia para filas específicas com base em regras de roteamento.
- Fila é um buffer que irá armazenar as mensagens.
- Binding define a relação entre uma exchange e uma fila. Ele determina como as mensagens devem ser roteadas da exchange para a fila.
- Consumidor é uma aplicação que recebe as mensagens da fila.
- Binding key é a chave que vincula a fila a uma exchange. Ela ficará mais clara nos exemplos abaixo.
- Routing key é um atributo da mensagem. Também ficará mais claro nos exemplos abaixo.
Na imagem abaixo há um exemplo dessa estrutura.
Tipos de Exchanges
Existem alguns tipos de exchanges.
Direct exchange
A Direct Exchange roteia mensagens para as filas com base em uma chave de roteamento exata. Cada mensagem enviada para uma direct exchange deve ter uma chave de roteamento, e as filas vinculadas a essa exchange devem especificar a chave de roteamento que desejam escutar.
Topic exchange
A Topic Exchange roteia mensagens com base em padrões de tópicos. A chave de roteamento é tratada como uma string de tópicos, e as filas podem se inscrever em padrões de tópicos usando caracteres curinga, como * (um token) e # (zero ou mais tokens).
Na imagem abaixo há um exemplo.
- Todos os logs de pedido vai receber todos os logs. O padrão é pedido-logs-#
- Log pedido cliente vai receber todos os logs de pedidos dos clientes. O padrão é pedido-logs-cliente-#
- Log pedido produtos eletronicos vai receber os logs de pedidos de produtos eletronicos. O padrão é pedido-logs-*-eletronicos.
Fanout exchange
A Fanout Exchange roteia mensagens para todas as filas vinculadas, independentemente da chave de roteamento. É útil, assim, para difundir mensagens para múltiplos consumidores.
Headers exchange
A Headers Exchange usa cabeçalhos de mensagens em vez de chave de roteamento para determinar o roteamento. As filas são vinculadas usando critérios baseados nos cabeçalhos.
Exemplo: Uma mensagem com o cabeçalho “format=pdf” será roteada para filas que estão configuradas para escutar por mensagens com o cabeçalho “format=pdf”.
Outras exchanges
Por fim, há mais duas exchanges.
A default exchange é uma direct exchange já definida que, além disso, não tem nome e geralmente é referenciada como uma string vazia. Se você enviar uma mensagem para essa exchange, a mensagem, então, é entregue para a fila que tem o nome da chave de roteamento.
A dead letter exchange possui um comportamento um pouco diferente. Caso não haja nenhum match entre a mensagem e a fila, a mensagem será descartada. Nesse cenário, o RabbitMQ possui uma extensão que, portanto, permite capturar essas mensagens que não são entregues.
Exemplo prático
Agora que já entendemos como funciona o RabbitMQ, vamos ver um exemplo prático de como usar RabbitMQ em Python usando a biblioteca pika.
1. Instalação da Biblioteca:
pip install pika
2. Produzindo Mensagens:
import pika
# Conectar ao servidor RabbitMQ
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
# Declarar uma fila
channel.queue_declare(queue='hello')
# Enviar uma mensagem
channel.basic_publish(exchange='', routing_key='hello', body='Hello, RabbitMQ!')
print(" [x] Sent 'Hello, RabbitMQ!'")
# Fechar a conexão
connection.close()
3. Consumindo Mensagens:
import pika
# Conectar ao servidor RabbitMQ
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
# Declarar a fila para garantir que ela existe
channel.queue_declare(queue='hello')
# Função de callback para processar mensagens
def callback(ch, method, properties, body):
print(f" [x] Received {body}")
# Configurar o consumidor
channel.basic_consume(queue='hello', on_message_callback=callback, auto_ack=True)
print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()
Testando RabbitMQ no CloudAMQP
Por fim, CloudAMQP oferece uma maneira fácil de testar RabbitMQ na nuvem gratuitamente. Portanto, você pode se inscrever para um plano gratuito e obter uma instância de RabbitMQ gerenciada.
1. Criar uma Conta:
Acesse CloudAMQP e crie uma conta.
2. Criar uma Instância:
Logo após fazer login, crie uma nova instância de RabbitMQ. Dessa forma, no plano gratuito você pode obter uma instância pequena para testes.
3. Configurar a Conexão:
Em seguida, utilize as credenciais fornecidas pelo CloudAMQP para configurar a conexão no seu código Python.
import pika
url = 'amqps://username:password@hostname/vhost'
params = pika.URLParameters(url)
connection = pika.BlockingConnection(params)
channel = connection.channel()
# Agora você pode usar o canal para declarar filas e enviar/receber mensagens
Conclusão
Para ver mais artigos iguais a esse, clique aqui.