Conceitos iniciais sobre RabbitMQ utilizando C#/.NET
Tags: rabbitmq, broker, dotnet, csharp
Published: 2023-10-21 23:04:47

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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1me26asexy5b5taaij96.png)

- 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](https://www.rabbitmq.com/download.html)

- [Código] Adicionar a dependência do pacote NuGet do RabbitMQ: [RabbitMQ .NET Client](https://www.nuget.org/packages/RabbitMQ.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 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();
```

**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();
```

**Ferramentas utilizadas**
- Pacote Nuget: [RabbitMQ.Client](https://www.nuget.org/packages/RabbitMQ.Client)
- Linguagem: C# .NET 6.0

**Código no GitHub**
- [Larissa Tavares - RabbitMQClient](https://github.com/larissatavares-ads/RabbitMQ-Solutions/tree/main/RabbitMQClient)

---

> _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#](https://www.rabbitmq.com/tutorials/tutorial-one-dotnet.html)
[RabbitMQ - Modelo AMQP 0-9-1 explicado](https://www.rabbitmq.com/tutorials/amqp-concepts.html)
[InfoWorld - How to work with RabbitMQ in C#](https://www.infoworld.com/article/3200210/how-to-work-with-rabbitmq-in-c.html)
[AWS - Abordagem arquitetônica do RabbitMQ](https://aws.amazon.com/pt/compare/the-difference-between-rabbitmq-and-kafka/#:~:text=Um%20agente%20do%20RabbitMQ%20permite,e%20as%20envia%20aos%20consumidores)


**Cursos recomendados**
[Alura - Microsserviços na prática: mensageria com RabbitMQ](https://cursos.alura.com.br/course/microsservicos-pratica-mensageria-rabbitmq)