DEV Community

Cover image for Brighter – Framework .NET para construção de aplicativos de mensageria
Rafael Andrade
Rafael Andrade

Posted on

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

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; 
}
Enter fullscreen mode Exit fullscreen mode

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);
    }
}
Enter fullscreen mode Exit fullscreen mode

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)!;
    }
}
Enter fullscreen mode Exit fullscreen mode

Configuração do Brighter

Registre os componentes do Brighter no HostBuilder:

services.AddHostedService<ServiceActivatorHostedService>()
    .AddServiceActivator(opt => {})
    .AutoFromAssemblies(); // Auto-registra handlers e mappers
Enter fullscreen mode Exit fullscreen mode

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());
Enter fullscreen mode Exit fullscreen mode

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)
    );
});
Enter fullscreen mode Exit fullscreen mode

Publicando uma Mensagem

var processor = host.Services.GetRequiredService<IAmACommandProcessor>();
processor.Post(new Greeting(Guid.NewGuid()) { Name = "Mundo" });
Enter fullscreen mode Exit fullscreen mode

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

AWS Security LIVE!

Join us for AWS Security LIVE!

Discover the future of cloud security. Tune in live for trends, tips, and solutions from AWS and AWS Partners.

Learn More

Top comments (0)

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay