Introdução ao Azure Service Bus

O Azure Service Bus é um message broker empresarial totalmente gerenciado que permite comunicações confiáveis entre aplicações e serviços, tanto em ambientes na nuvem quanto híbridos. Ele suporta filas de mensagens (comunicação ponto a ponto) e tópicos do tipo publish-subscribe (distribuição para múltiplos consumidores), sendo ideal para desacoplar sistemas distribuídos.

O Brighter oferece integração nativa com o Azure Service Bus por meio do pacote Paramore.Brighter.MessagingGateway.AzureServiceBus, permitindo roteamento eficiente de comandos e eventos em aplicações .NET.

Requisitos

Recapitulando o Brighter

Antes de configurar o Azure Service Bus, vamos relembrar 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

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 Azure Service Bus

1. Configuração da Conexão

Use o provedor de credenciais do Azure para autenticação segura:

var connection = new ServiceBusVisualStudioCredentialClientProvider(".servicebus.windows.net");

Ou use uma connection string:

var connection = new ServiceBusConnectionStringClientProvider("");

2. Inscrição no Azure Service Bus (Consumer)

Assine uma fila ou tópico:

.AddServiceActivator(opt =>
{
    opt.Subscriptions = [
        new AzureServiceBusSubscription<Greeting>(
            new SubscriptionName("greeting-subscription"), // Opcional
            new ChannelName("greeting-queue"), // Nome da fila
            new RoutingKey("greeting-topic"), // Nome do tópico
            bufferSize: 2)
    ];
    opt.ChannelFactory = new AzureServiceBusChannelFactory(new AzureServiceBusConsumerFactory(connection, false));
})

3. Publicação no Azure Service Bus (Producer)

Publique eventos em um tópico:

.UseExternalBus(new AzureServiceBusProducerRegistryFactory(connection, new[]
{
    new AzureServiceBusPublication
    {
        Topic = new RoutingKey("greeting-topic"),
        MakeChannels = OnMissingChannel.Create
    }
}).Create());

4. Filas de Cartas Mortas (DLQ - Dead Letter Queue)

Habilite DLQs para tratar mensagens problemáticas:

opt.Subscriptions = [
    new AzureServiceBusSubscription<Greeting>(
        subscriptionName: new SubscriptionName("greeting-subscription"),
        channelName: new ChannelName("greeting-queue"),
        routingKey: new RoutingKey("greeting-topic"),
        subscriptionConfiguration: new AzureServiceBusSubscriptionConfiguration
        {
            DeadLetteringOnMessageExpiration = true // Ativa DLQ
        },
        bufferSize: 2
    )
];

O Azure Service Bus move automaticamente mensagens expiradas ou com falha para uma DLQ, onde podem ser inspecionadas e tratadas.

Conclusão

A integração entre Brighter e Azure Service Bus permite construir sistemas de mensageria robustos e escaláveis em aplicações .NET. Ao combinar a infraestrutura gerenciada do Azure com a abstração oferecida pelo Brighter, você pode:

  • Desacoplar serviços usando padrões de publish-subscribe.
  • Garantir ordenação e confiabilidade nas mensagens.
  • Simplificar o tratamento de erros com DLQs.

Para uso em produção, sempre valide as configurações contra a documentação mais recente do Brighter.

Referências