Componentes RabbitMQ | Channel (Model), Exchange, BasicQos, VirtualHost, Topic, Fanout | CSharp
- Componentes RabbitMQ | Channel (Model), Exchange, BasicQos, VirtualHost, Topic, Fanout | CSharp
Virtual Host
- Um Virtual Host (vhost) no RabbitMQ é um mecanismo que permite a organização e o isolamento de recursos (como filas, exchanges e bindings) dentro de uma instância do RabbitMQ. Ele funciona como um namespace, permitindo que diferentes aplicativos compartilhem a mesma instância do servidor RabbitMQ sem interferirem uns nos outros.
Isolamento de Recursos:
Cada vhost tem seu próprio conjunto de filas, exchanges e bindings, que são independentes dos vhosts de outros aplicativos.
Controle de Acesso:
Permite configurar permissões específicas para usuários em cada vhost. Isso significa que um usuário pode ter acesso apenas aos recursos de um vhost específico.
Namespace:
Como filas e exchanges são únicas dentro de um vhost, isso evita conflitos de nomes entre aplicativos diferentes que usam a mesma instância do RabbitMQ.
Multi-Tenant:
Um vhost permite que múltiplos aplicativos ou serviços compartilhem o mesmo servidor RabbitMQ sem colisão de configurações ou dados.

A conexão do RabbitMQ | ConnectionFactory | RabbitMQ
Documentação sobre Connection Factory: 🔗 Clique aqui
Model (Channel) - Publicador e Consumidor | RabbitMQ
No nosso provider para .NET do rabbitmq, chamaram o channel de model
- Você pode declarar uma fila, publicar e consumir. Tudo isso é feito pelo
Model/Channel
// PUBLICADOR
//IModel
using (var channel = connection.CreateModel())
{
// Declarando a fila
string queueName = "minha_fila";
channel.QueueDeclare(
queue: queueName, // Nome da fila
durable: false, // Se a fila persiste após reinício do servidor
exclusive: false, // Se a fila é exclusiva para conexão
autoDelete: false, // Se será apagada quando não houver consumidores
arguments: null); // Argumentos adicionais
// Mensagem a ser enviada
string mensagem = "Olá, RabbitMQ!";
var body = Encoding.UTF8.GetBytes(mensagem);
// Publicando a mensagem na fila
channel.BasicPublish(
exchange: "", // Exchange vazio para envio direto à fila
routingKey: queueName, // Nome da fila como routingKey
basicProperties: null, // Sem propriedades adicionais
body: body); // Corpo da mensagem
Console.WriteLine($"Mensagem enviada: {mensagem}");
}
// CONSUMIDOR
using (var channel = connection.CreateModel())
{
// Declarando a fila
string queueName = "minha_fila";
channel.QueueDeclare(queue: queueName, durable: false, exclusive: false, autoDelete: false, arguments: null);
channel.BasicQos(0, 100, false);
// Configurando o consumidor
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
var body = ea.Body.ToArray();
var mensagem = Encoding.UTF8.GetString(body);
Console.WriteLine($"Mensagem recebida: {mensagem}");
};
// Consumindo as mensagens
channel.BasicConsume(queue: queueName, autoAck: true, consumer: consumer);
Console.WriteLine("Aguardando mensagens... Pressione [ENTER] para sair.");
Console.ReadLine();
}
Algumas configurações do Model | QOS prefetch
QOS prefetch- É adicionado do lado do consumidor, define quantas mensagens irá ser enviada de uma vez para sempre ter mensagens em memória do lado do consumidor. Isso ajuda em casos onde a rede tem latência
uint prefetchSize = 0; // Tamanho das mensagens (geralmente 0 para ignorar)
ushort prefetchCount = 5; // Máximo de mensagens sem ACK
bool global = false; // QoS para consumidores individuais
channel.BasicQos(prefetchSize, prefetchCount, global);
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
//...
Exchange | RabbitMQ
Publisher → exchange
# Publisher não sabe para qual fila ele está enviando
Consumer → cria a fila → cria a associação entre a sua fila e a exchange
Tipos de exchange
Topic
A Topic Exchange permite que mensagens sejam roteadas para uma ou mais filas com base em uma chave de roteamento (routing key). As filas declaram padrões para as chaves de roteamento usando expressões com * e #.
Funcionamento:
- Routing Key: Uma string separada por pontos (ex.: logs.info, user.signup, order.created).
- Bindings: As filas se conectam à exchange com patterns:
*corresponde a uma palavra única.#corresponde a zero ou mais palavras.
Routing Keysó faz sentido nesse tipo de exchange
// Publicador
string exchangeName = "topic_logs";
channel.ExchangeDeclare(exchange: exchangeName, type: "topic");
// Publicando mensagens com diferentes routing keys
var routingKey = "logs.error";
string mensagem = "Erro crítico no sistema!";
var body = Encoding.UTF8.GetBytes(mensagem);
channel.BasicPublish(exchange: exchangeName, routingKey: routingKey, basicProperties: null, body: body);
// Consumidor
string exchangeName = "topic_logs";
string queueName = channel.QueueDeclare().QueueName;
// Vinculando a fila à exchange com um padrão
string bindingKey = "logs.*";
channel.QueueBind(queue: queueName, exchange: exchangeName, routingKey: bindingKey);
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
var body = ea.Body.ToArray();
var mensagem = Encoding.UTF8.GetString(body);
Console.WriteLine($"Mensagem recebida: {mensagem}, Routing Key: {ea.RoutingKey}");
};
channel.BasicConsume(queue: queueName, autoAck: true, consumer: consumer);
Fanout
Roteia mensagens para todas as filas conectadas a ela, independentemente da routing key ou qualquer outro critério de roteamento.