O RabbitMQ é um message broker, pois aceita e encaminha mensagens.
Um message broker é um software que possibilita que aplicativos, sistemas e serviços se comuniquem e troquem informações.
Alguns termos a se compreender
- Produtor (Producer): É um programa que envia mensagens.
- Consumidor (Consumer): É um programa que espera por mensagens.
- Fila (Queue): É a caixa postal do RabbitMQ. É um local de armazenamento, que recebe uma mensagem de uma central de troca e as envia aos consumidores.
- Troca (Exchange): É quem recebe as mensagens do produtor e determina para onde elas devem ser encaminhadas.
- Vinculação (Binding): É o relacionamento entre uma exchange e uma queue.
Protocolos de comunicação
São responsáveis pela operação do message broker e de como será feito o envio e recebimento de mensagens entre os clientes.
- AMQP (Advanced Messaging Queue Protocol)
O modelo AMQP tem a seguinte proposta: Um produtor publica mensagens em uma exchange, que distribui cópias dessas mensagens para queues utilizando as regras denominadas bindings. Em seguida o broker entrega as mensagens aos consumidores inscritos na fila.
- MQTT (Message Queue Telemetry Transport)
É um protocolo para troca de mensagens em ambientes onde existe alguma restrição de hardware, como pouca memória disponível, por exemplo, ou uma limitação de banda. Enfatiza mensagens leves de publicação/assinatura, direcionado a clientes em dispositivos restritos.
- STOMP (Simple (or Streaming) Text Oriented Message Protocol)
É um protocolo baseado em texto, construído para trabalhar com middlewares orientados à mensagem. Possui uma estrutura similar ao AMQP, com cabeçalho, propriedades e corpo da mensagem, porém não lida com tópicos ou filas. Ele usa uma semântica de string de destino.
Persistência no RabbitMQ
No RabbitMQ existem dois tipos de fila: as duráveis e as não duráveis. As filas duráveis fazem com que as mensagens permaneçam no disco, enquanto uma fila não durável permanece apenas na memória. Portanto, após a reinicialização do servidor as mensagens nas filas duráveis ficam disponíveis, enquanto as mensagens nas filas não duráveis são perdidas.
Client .NET/C#
Neste exemplo será criado um produtor que envia uma mensagem e um consumidor que recebe as mensagens e as imprime no console.
Passos
[Estação de trabalho] Instalar o RabbitMQ: Downloading and Installing RabbitMQ
[Código] Adicionar a dependência do pacote NuGet do RabbitMQ: RabbitMQ .NET Client.
[Código] Criar uma conexão com o servidor. Esta conexão será usada tanto para o produtor quanto para o consumidor.
var factory = new ConnectionFactory { HostName = "localhost" };
using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();
PRODUTOR
- [Código] Declarar uma fila para enviar a mensagem com
QueueDeclare
e publicar uma mensagem na fila comBasicPublish
.
using System.Text;
using RabbitMQ.Client;
var factory = new ConnectionFactory { HostName = "localhost" };
using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();
channel.QueueDeclare(queue: "hello",
durable: false,
exclusive: false,
autoDelete: false,
arguments: null);
const string message = "Hello World!";
var body = Encoding.UTF8.GetBytes(message);
channel.BasicPublish(exchange: string.Empty,
routingKey: "hello",
basicProperties: null,
body: body);
Console.WriteLine($" [x] Sent {message}");
Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();
CONSUMIDOR
- [Código] Declarar a fila da qual será consumida as mensagens com
QueueDeclare
, adicionar uma manipulador de eventos denominadoEventingBasicConsumer
e consumir a mensagem comBasicConsume
.
using System.Text;
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
var factory = new ConnectionFactory { HostName = "localhost" };
using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();
channel.QueueDeclare(queue: "hello",
durable: false,
exclusive: false,
autoDelete: false,
arguments: null);
Console.WriteLine(" [*] Waiting for messages.");
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
var body = ea.Body.ToArray();
var message = Encoding.UTF8.GetString(body);
Console.WriteLine($" [x] Received {message}");
};
channel.BasicConsume(queue: "hello",
autoAck: true,
consumer: consumer);
Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();
Ferramentas utilizadas
- Pacote Nuget: RabbitMQ.Client
- Linguagem: C# .NET 6.0
Código no GitHub
Com isso finalizamos nossos entendimentos iniciais acerca do RabbitMQ. Para aqueles que estão começando agora no ramo da mensageria este post lhe dá um direcionamento inicial. Abaixo seguem as referências de artigos utilizados e cursos recomendados.
Referências
RabbitMQ - "Olá Mundo" usando o cliente .NET/C#
RabbitMQ - Modelo AMQP 0-9-1 explicado
InfoWorld - How to work with RabbitMQ in C#
AWS - Abordagem arquitetônica do RabbitMQ
Cursos recomendados
Alura - Microsserviços na prática: mensageria com RabbitMQ
Top comments (1)
Hey, thanks for your article, keep going!