DEV Community

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

Posted on • Edited on

5 2

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

Image of Docusign

Bring your solution into Docusign. Reach over 1.6M customers.

Docusign is now extensible. Overcome challenges with disconnected products and inaccessible data by bringing your solutions into Docusign and publishing to 1.6M customers in the App Center.

Learn more

Top comments (1)

Collapse
 
dealwith profile image
Gleb Krishin

Hey, thanks for your article, keep going!

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

Explore a sea of insights with this enlightening post, highly esteemed within the nurturing DEV Community. Coders of all stripes are invited to participate and contribute to our shared knowledge.

Expressing gratitude with a simple "thank you" can make a big impact. Leave your thanks in the comments!

On DEV, exchanging ideas smooths our way and strengthens our community bonds. Found this useful? A quick note of thanks to the author can mean a lot.

Okay