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)