Brighter + RabbitMQ: Como configurar Brighter com RabbitMQ
Introdução ao RabbitMQ O RabbitMQ é um dos brokers de mensagens mais utilizados, implementando o Advanced Message Queuing Protocol (AMQP) para garantir entrega confiável de mensagens. Desenvolvido na linguagem Erlang, oferece alta escalabilidade e tolerância a falhas, sendo ideal para sistemas distribuídos. O RabbitMQ age como intermediário que aceita mensagens de produtores e as entrega a consumidores, desacoplando serviços em arquiteturas de microserviços. Requisitos .NET 8 ou superior Projeto .NET com os seguintes pacotes NuGet: Paramore.Brighter.MessagingGateway.RMQ: Habilita integração com RabbitMQ. Paramore.Brighter.ServiceActivator.Extensions.DependencyInjection: Permite registrar o Brighter com DI do Microsoft. Paramore.Brighter.ServiceActivator.Extensions.Hosting: Hospeda o Brighter como serviço em segundo plano. Serilog.AspNetCore: Para logs estruturados (opcional, mas recomendado). Recapitulação do Brighter Antes de configurar o RabbitMQ, vamos revisar conceitos básicos do Brighter: Mensagens (Comandos/Eventos) Defina mensagens usando IRequest: public class Greeting : Event(Guid.NewGuid()) { public string Name { get; set; } = string.Empty; } Comandos: Operações direcionadas a um único destinatário (ex: SendEmail). Eventos: Notificações broadcast (ex: OrderShipped). Mapeador de Mensagens Converte entre mensagens do Brighter e objetos da aplicação: public class GreetingMapper : IAmAMessageMapper { public Message MapToMessage(Greeting request) { var header = new MessageHeader { Id = request.Id, TimeStamp = DateTime.UtcNow, Topic = "greeting.topic", MessageType = MessageType.MT_EVENT }; var body = new MessageBody(JsonSerializer.Serialize(request)); return new Message(header, body); } public Greeting MapToRequest(Message message) { return JsonSerializer.Deserialize(message.Body.Bytes)!; } } Manipulador de Requisições(Request Handler) Processa as mensagens recebidas: public class GreetingHandler(ILogger logger) : RequestHandler { public override Greeting Handle(Greeting command) { logger.LogInformation("Olá, {Name}!", command.Name); return base.Handle(command); } } Configuração do Brighter com RabbitMQ 1. Configuração da Conexão Defina os detalhes de conexão com o RabbitMQ: var connection = new RmqMessagingGatewayConnection { AmpqUri = new AmqpUriSpecification(new Uri("amqp://guest:guest@localhost:5672")), Exchange = new Exchange("paramore.brighter.exchange"), }; 2. Inscrição no RabbitMQ Inscreva-se em uma fila/tópico: .AddServiceActivator(opt => { opt.Subscriptions = [ new RmqSubscription( new SubscriptionName("kafka.greeting.subscription"), new ChannelName("greeting.queue"), new RoutingKey("greeting.topic"), makeChannels: OnMissingChannel.Create ), ]; opt.ChannelFactory = new ChannelFactory( new RmqMessageConsumerFactory(connection) ); }) 3. Configuração do Produtor RabbitMQ Publique eventos em um tópico: .UseExternalBus(new RmqProducerRegistryFactory(connection, new[] { new RmqPublication { Topic = new RoutingKey("greeting.topic"), MakeChannels = OnMissingChannel.Create } }).Create()); Melhores Práticas Filas de Cartas Mortas(DLQ): Configure DLQs no RabbitMQ para tratar mensagens problemáticas. Use deadLetterChannelName e deadLetterRoutingKey nas declarações de filas. Monitoramento: Utilize o plugin de gerenciamento do RabbitMQ para acompanhar saúde e desempenho das filas. Tratamento de Erros: Implemente retentativas e circuit breakers para falhas transitórias (o Brighter suporta isso via atributos, abordarei em outro artigo). Conclusão A integração do Brighter com o RabbitMQ permite construir sistemas de mensageria robustos e escaláveis em aplicações .NET. Ao combinar o protocolo AMQP do RabbitMQ com a camada de abstração do Brighter, você pode: Desacoplar serviços com padrões de publish-subscribe. Garantir ordenação e confiabilidade nas mensagens. Simplificar o tratamento de erros com DLQs e retentativas. Para uso em produção, valide as configurações contra a documentação mais recente do Brighter, pois recursos como priorização de mensagens ou exchanges com atraso podem evoluir. Referências Código Completo: Repositório GitHub Documentação Oficial: Brighter + RabbitMQ

Introdução ao RabbitMQ
O RabbitMQ é um dos brokers de mensagens mais utilizados, implementando o Advanced Message Queuing Protocol (AMQP) para garantir entrega confiável de mensagens. Desenvolvido na linguagem Erlang, oferece alta escalabilidade e tolerância a falhas, sendo ideal para sistemas distribuídos. O RabbitMQ age como intermediário que aceita mensagens de produtores e as entrega a consumidores, desacoplando serviços em arquiteturas de microserviços.
Requisitos
- .NET 8 ou superior
- Projeto .NET com os seguintes pacotes NuGet:
- Paramore.Brighter.MessagingGateway.RMQ: Habilita integração com RabbitMQ.
- Paramore.Brighter.ServiceActivator.Extensions.DependencyInjection: Permite registrar o Brighter com DI do Microsoft.
- Paramore.Brighter.ServiceActivator.Extensions.Hosting: Hospeda o Brighter como serviço em segundo plano.
- Serilog.AspNetCore: Para logs estruturados (opcional, mas recomendado).
Recapitulação do Brighter
Antes de configurar o RabbitMQ, vamos revisar conceitos básicos do Brighter:
Mensagens (Comandos/Eventos)
Defina mensagens usando IRequest
:
public class Greeting : Event(Guid.NewGuid())
{
public string Name { get; set; } = string.Empty;
}
-
Comandos: Operações direcionadas a um único destinatário (ex:
SendEmail
). -
Eventos: Notificações broadcast (ex:
OrderShipped
).
Mapeador de Mensagens
Converte entre mensagens do Brighter e objetos da aplicação:
public class GreetingMapper : IAmAMessageMapper<Greeting>
{
public Message MapToMessage(Greeting request)
{
var header = new MessageHeader
{
Id = request.Id,
TimeStamp = DateTime.UtcNow,
Topic = "greeting.topic",
MessageType = MessageType.MT_EVENT
};
var body = new MessageBody(JsonSerializer.Serialize(request));
return new Message(header, body);
}
public Greeting MapToRequest(Message message)
{
return JsonSerializer.Deserialize<Greeting>(message.Body.Bytes)!;
}
}
Manipulador de Requisições(Request Handler)
Processa as mensagens recebidas:
public class GreetingHandler(ILogger<GreetingHandler> logger) : RequestHandler<Greeting>
{
public override Greeting Handle(Greeting command)
{
logger.LogInformation("Olá, {Name}!", command.Name);
return base.Handle(command);
}
}
Configuração do Brighter com RabbitMQ
1. Configuração da Conexão
Defina os detalhes de conexão com o RabbitMQ:
var connection = new RmqMessagingGatewayConnection
{
AmpqUri = new AmqpUriSpecification(new Uri("amqp://guest:guest@localhost:5672")),
Exchange = new Exchange("paramore.brighter.exchange"),
};
2. Inscrição no RabbitMQ
Inscreva-se em uma fila/tópico:
.AddServiceActivator(opt =>
{
opt.Subscriptions = [
new RmqSubscription<Greeting>(
new SubscriptionName("kafka.greeting.subscription"),
new ChannelName("greeting.queue"),
new RoutingKey("greeting.topic"),
makeChannels: OnMissingChannel.Create
),
];
opt.ChannelFactory = new ChannelFactory(
new RmqMessageConsumerFactory(connection)
);
})
3. Configuração do Produtor RabbitMQ
Publique eventos em um tópico:
.UseExternalBus(new RmqProducerRegistryFactory(connection, new[]
{
new RmqPublication
{
Topic = new RoutingKey("greeting.topic"),
MakeChannels = OnMissingChannel.Create
}
}).Create());
Melhores Práticas
- Filas de Cartas Mortas(DLQ): Configure DLQs no RabbitMQ para tratar mensagens problemáticas. Use
deadLetterChannelName
edeadLetterRoutingKey
nas declarações de filas. - Monitoramento: Utilize o plugin de gerenciamento do RabbitMQ para acompanhar saúde e desempenho das filas.
- Tratamento de Erros: Implemente retentativas e circuit breakers para falhas transitórias (o Brighter suporta isso via atributos, abordarei em outro artigo).
Conclusão
A integração do Brighter com o RabbitMQ permite construir sistemas de mensageria robustos e escaláveis em aplicações .NET. Ao combinar o protocolo AMQP do RabbitMQ com a camada de abstração do Brighter, você pode:
- Desacoplar serviços com padrões de publish-subscribe.
- Garantir ordenação e confiabilidade nas mensagens.
- Simplificar o tratamento de erros com DLQs e retentativas.
Para uso em produção, valide as configurações contra a documentação mais recente do Brighter, pois recursos como priorização de mensagens ou exchanges com atraso podem evoluir.
Referências
- Código Completo: Repositório GitHub
- Documentação Oficial: Brighter + RabbitMQ