Brighter – Um framework .NET para construção de aplicativos de mensageria

Rafael AndradeRafael Andrade
2 min read

e 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

0
Subscribe to my newsletter

Read articles from Rafael Andrade directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Rafael Andrade
Rafael Andrade