RabbitMQ: o que é e como utilizar
Por Rogério Marques
29 março 2018 - 16:18 | Atualizado em 09 agosto 2023 - 14:49
RabbitMQ é um servidor de mensageria de código aberto (open source) desenvolvido em Erlang, implementado para suportar mensagens em um protocolo denominado Advanced Message Queuing Protocol (AMQP). Ele possibilita lidar com o tráfego de mensagens de forma rápida e confiável, além de ser compatível com diversas linguagens de programação, possuir interface de administração nativa e ser multiplataforma.
Dentre as aplicabilidades do RabbitMQ, estão possibilitar a garantia de assincronicidade entre aplicações, diminuir o acoplamento entre aplicações, distribuir alertas e controlar fila de trabalhos em background.
Este artigo tem como objetivo demonstrar um simples exemplo de como utilizar o RabbitMQ.
Conceitos
Mensagem:
Uma mensagem é dividida em duas partes:
- Payload – é o corpo com os dados que serão transmitidos. Suporta vários tipos de dados como um array json até um filme mpeg.
- Label – é responsável pela descrição do payload e também como o RabbitMQ saberá quem irá receber a mensagem.
Fila:
Onde as mensagens ficam e são retiradas pelos consumers.
Publisher:
É o responsável por incluir cada nova mensagem na fila, ou seja, enviar a mensagem.
Consumer:
Como diz o próprio nome, é o agente responsável por consumir e retirar a informação da fila.
Criando Publisher
Para começarmos, precisamos do RabbitMQ, que pode ser adquirido gratuitamente através do site oficial: https://www.rabbitmq.com/download.html, lembrando que também é possível utilizar com Docker.
Neste Tutorial de RabbitMQ utilizarei Asp.Net Core 2.0. Você também pode usar o .NET Framework, no entanto as etapas de configuração serão diferentes.
1 – Primeiramente crie um console application para o publisher e adicione o pacote nuget do RabbitMQ depois restaure o projeto.
- dotnet add package RabbitMQ.Client
- dotnet restore
2 – Depois iremos montar a conexão com o seguinte código:
1 using System;
2 using RabbitmQ.Client;
3
4 namespace Cedro
5 {
0 references
6 class Enviar
{
0 references
8 static void Main()
9 {
10 var factory = new ConnectionFactory() ( HostName = “localhost” ) };
11 using (var connection = factory.CreateConnection())
12 {
13 using (var channel = connection.CreateModel())
14 {
15
16 }
17 }
18 }
19 }
20 }
21
Aqui nos conectamos a uma máquina local, daí o localhost. Se quisermos nos conectar a uma máquina diferente, simplesmente especificaremos seu nome ou endereço IP.
3 – Agora iremos declarar a fila e criar a mensagem:
1 using System;
2 using system.Text;
3 using RabbitMQ.Client;
4
5 namespace Cedro
6 {
0 references
7 class Enviar
8 {
9 static void Main ()
10 {
11 var factory = new ConnectionFactory() { HostName = ‘’localhost’’ };
12 using ( var connection = factory.CreateConnection())
13 {
14 using (var channel = connection.CreateModel))
15 {
16 channel.QueueDeclare(queue: ‘’CedroBlog’’,
17 durable: false,
18 exclusive: false,
19 autoDelete: false,
20 arguments: null);
21
22 string message = ‘’Tutorial RabbitMQ!’’ ;
23 var body = Encoding.UTF8.Getbytes(message);
24 }
25 }
26 }
27 }
28 }
A fila só será criada se já não existir. O conteúdo da mensagem é uma matriz de bytes, para que você possa codificar o que quiser.
4 – Aqui iremos adicionar o método para publicar a mensagem:
0 references
class Enviar
{
0 references
static void Main( )
{
var factory = new ConnectionFactory( ) { HostName = “localhost” }; using (var connection = factory.CreateConnection( ) )
{
using (var channel connection.CreateModel( ) )
{
channel.QueueDeclare (queue: “CedroBlog“,
durable: false,
exclusive: false,
autoDelete: false,
arguments: null);
string message = “Tutorial RabbitMQ!”; var body = Encoding.UTF8.GetBytes(message);
channel.BasicPublish(exchange ‘’ ’’:
routingKey: “CedroBlog”,
basicProperties: null,
body: body );
Console.WriteLine (“Mensagem Enviada!”);
}
Console.ReadLine( );
}
}
}
}
E está pronto nosso publisher: ele irá enviar para a fila CedroBlog a mensagem que está no body.
Criando Consumer
1 – Para o consumer, iremos criar outro console application, criar a conexão e declarar fila da mesma maneira que no publisher:
1 using RabbitMQ.Client;
2 using RabbitMQ.Client.Events;
3 using System;
4 using System.Text;
5
6 namespace Cedro
7 {
0 references
8 class Program
9 {
0 references
10 static void Main( )
11 {
12 var factory = new ConnectionFactory( ) { HostName = “localhost” }; using (var
13 connection factory.CreateConnection( ) )
14 {
15 using (var channel connection. CreateModel( ) )
16 {
17 channel.QueueDeclare (queue: “CedroBlog”,
18 durable: false,
19 exclusive: false,
20 autoDelete: false,
21 arguments: null);
22
23 }
24 }
25 }
26 }
27 }
2 – Agora adicionamos a parte do consumidor, que irá pegar as mensagens da fila:
6 namespace Cedro
7 {
0 references
8 class Program
9 {
0 references
10 static void Main( )
11 {
12 var factory = new ConnectionFactory( ) { HostName = “localhost” }; using (var
13 connection factory.CreateConnection( ) )
14 {
15 using (var channel = connection. CreateModel( ) )
16 {
17 channel.QueueDeclare (queue: “CedroBlog”,
18 durable: false,
19 exclusive: false,
20 autoDelete: false,
21 arguments: null);
22
23 var consumer = new EventingBasicConsumer (channel); consumer.
24 Received += (model, ea) =>
25 {
26 var body ea.Body;
27 var message = Encoding.UTF8.GetString(body);
28 Console.WriteLine(message);
29 };
30 channel.BasicConsume (queue: “CedroBlog”,
31 autoAck: true,
32 consumer: consumer);
33
34 Console.WriteLine(“Consumer Funcionando”);
35 Console.ReadLine( );
36 }
37 }
Usamos um console ReadLine, para manter a aplicação rodando. Nosso consumer pegará toda mensagem que chega na fila CedroBlog e nos mostrará o que ela contém.
Resultado
Para ver os resultados, execute primeiramente o consumer e logo em seguida o publisher. O resultado deverá ser semelhante a este:
C:\User\Nathan\Desktop\RabbirMQCedro\Cedro>dotnet run
Mensagem Enviada!
C:\User\Nathan\Desktop\RabbirMQCedro\Cedro>dotnet run
Consumer Funcionando
Tutorial RabbitMQ!
Opa, bom artigo introdutório. Mas a linha 26 pra converter a msg de volta para string precisa ajsutar para: var body = ea.Body.ToArray();