DEV Community

Cover image for Conceitos iniciais sobre RabbitMQ utilizando C#/.NET
Larissa Tavares
Larissa Tavares

Posted on • Updated on

Conceitos iniciais sobre RabbitMQ utilizando C#/.NET

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.

Image description

  • 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();
Enter fullscreen mode Exit fullscreen mode

PRODUTOR

  • [Código] Declarar uma fila para enviar a mensagem com QueueDeclare e publicar uma mensagem na fila com BasicPublish.
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();
Enter fullscreen mode Exit fullscreen mode

CONSUMIDOR

  • [Código] Declarar a fila da qual será consumida as mensagens com QueueDeclare, adicionar uma manipulador de eventos denominado EventingBasicConsumer e consumir a mensagem com BasicConsume.
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();
Enter fullscreen mode Exit fullscreen mode

Ferramentas utilizadas

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)

Collapse
 
dealwith profile image
Gleb Krishin

Hey, thanks for your article, keep going!