Se você precisa construir uma aplicação .NET que utilize filas ou streams, o Paramore Brighter é uma excelente opção. Baseado em padrões de integração empresarial, ele oferece flexibilidade e recursos avançados, como distributed lock e outbox patterns.
Projeto
Neste exemplo, vamos enviar e consumir mensagens usando Brighter com RabbitMQ. Pré-requisitos:
- Podman (para executar o RabbitMQ)
- .NET 8 ou 9
Pacotes Necessários
Instale os seguintes pacotes NuGet:
- Paramore.Brighter.ServiceActivator: Para consumo de mensagens.
- Paramore.Brighter.ServiceActivator.Extensions.DependencyInjection: Métodos úteis para registro do Brighter.
- Paramore.Brighter.ServiceActivator.Extensions.Hosting: Suporte a execução de consumidores em segundo plano.
- Paramore.Brighter.MessagingGateway.RMQ: Integração com RabbitMQ.
Definição de Mensagens
Todas as mensagens no Brighter devem implementar a interface IRequest
.
- Comandos: Têm um único consumidor e permitem resposta.
- Eventos: Representam algo que já ocorreu e podem ter múltiplos consumidores.
public class Greeting(Guid id) : Event(id)
{
public string Name { get; set; } = string.Empty;
}
Handlers
Handlers processam as mensagens de forma síncrona ou assíncrona.
public class GreetingHandler : RequestHandler<Greeting>
{
private readonly ILogger<GreetingHandler> _logger;
public GreetingHandler(ILogger<GreetingHandler> logger)
{
_logger = logger;
}
public override Greeting Handle(Greeting request)
{
_logger.LogInformation("Olá, {Name}!", request.Name);
return base.Handle(request);
}
}
Message mapper
O Brighter separa cabeçalho e corpo da mensagem, permitindo serialização personalizada (ex: JSON, gRPC).
public class GreetingMapper : IAmAMessageMapper<Greeting>
{
public Message MapToMessage(Greeting request)
{
var header = new MessageHeader();
header.Id = request.Id;
header.TimeStamp = DateTime.UtcNow;
header.Topic = "greeting.event";
header.MessageType = MessageType.MT_EVENT;
var body = new MessageBody(
JsonSerializer.Serialize(request, JsonSerialisationOptions.Options)
);
return new Message(header, body);
}
public Greeting MapToRequest(Message message)
{
return JsonSerializer.Deserialize<Greeting>(message.Body.Bytes)!;
}
}
Configuração do Brighter
Registre os componentes do Brighter no HostBuilder:
services.AddHostedService<ServiceActivatorHostedService>()
.AddServiceActivator(opt => {})
.AutoFromAssemblies(); // Auto-registra handlers e mappers
Configuração do RabbitMQ:
var rmqConnection = new RmqMessagingGatewayConnection
{
AmpqUri = new AmqpUriSpecification(new Uri("amqp://guest:guest@localhost:5672")),
Exchange = new Exchange("paramore.brighter.exchange"),
};
services.AddServiceActivator(opt => {})
.UseExternalBus(new RmqProducerRegistryFactory(
rmqConnection,
new RmqPublication[]
{
new()
{
MakeChannels = OnMissingChannel.Create,
Topic = new RoutingKey("greeting.event"),
}
}
).Create());
Configuração do Consumidor:
services.AddServiceActivator(opt =>
{
opt.Subscriptions = new Subscription[]
{
new RmqSubscription<Greeting>(
new SubscriptionName("paramore.example.greeting"),
new ChannelName("greeting.event"),
new RoutingKey("greeting.event"),
makeChannels: OnMissingChannel.Create
)
};
opt.ChannelFactory = new ChannelFactory(
new RmqMessageConsumerFactory(rmqConnection)
);
});
Publicando uma Mensagem
var processor = host.Services.GetRequiredService<IAmACommandProcessor>();
processor.Post(new Greeting(Guid.NewGuid()) { Name = "Mundo" });
Conclusão
O Paramore Brighter é uma ferramenta poderosa, mas exige familiaridade com padrões de Enterprise Integration Patterns para aproveitar todo seu potencial. Futuros artigos explorarão esses padrões e casos de uso avançados.
Referências
Documentação do Paramore Brighter
Exemplo Completo no GitHub
Top comments (0)