Como funciona o RabbitMQ?

rabbitmq

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.

estrutura do rabbitmq

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.

direct_exchange

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.

topic_exchange

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.

fanout_exchange

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”.

header_exchange

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

Portanto, RabbitMQ é uma ferramenta poderosa para mensageria assíncrona que, além disso, facilita a comunicação entre diferentes partes de uma aplicação de maneira eficiente e escalável. Com suporte para diversos tipos de exchanges e, ainda, flexibilidade de configuração, RabbitMQ se adapta, assim, a diferentes necessidades de roteamento de mensagens.

Para ver mais artigos iguais a esse, clique aqui.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Rolar para cima