Integração do Brighter com Microsoft SQL Server

Introdução ao Microsoft SQL Server O Microsoft SQL Server é um sistema robusto de gerenciamento de banco de dados relacional (RDBMS), amplamente adotado em ecossistemas .NET. Embora tradicionalmente usado para armazenamento transacional, o SQL Server também pode atuar como broker de mensagens em sistemas distribuídos. O Brighter—uma biblioteca de processamento de comandos—suporta o SQL Server como backend de mensageria, oferecendo uma solução pragmática para cenários onde implantar brokers dedicados (como RabbitMQ ou Kafka) é inviável (ex: projetos pequenos ou ambientes legados). Requisitos .NET 8+ Pacotes NuGet no projeto: Paramore.Brighter.MessagingGateway.MsSql: Habilita o SQL Server como broker de mensagens. Paramore.Brighter.ServiceActivator.Extensions.DependencyInjection: Integra o Brighter com serviços de mensageria. Paramore.Brighter.ServiceActivator.Extensions.Hosting: Hospeda o Brighter como serviço em segundo plano. Serilog.AspNetCore: opcional, mas recomendado para logs estruturados. Recapitulação do Brighter Antes de configurar o SQL Server, relembre conceitos essenciais 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 com um único destinatário (ex: EnviarEmail). Eventos: Notificações para múltiplos consumidores (ex: PedidoEnviado). Mapeador de Mensagens Converte mensagens do Brighter para objetos da aplicação: public class GreetingMapper : IAmAMessageMapper { public Message MapToMessage(Greeting request) { var header = new MessageHeader { Id = request.Id, TimeStamp = DateTime.UtcNow, Topic = "greeting.topic", // Tópico de destino MessageType = MessageType.MT_EVENT }; var body = new MessageBody(JsonSerializer.Serialize(request)); return new Message(header, body); } public Greeting MapToRequest(Message message) { return JsonSerializer.Deserialize(message.Body.Bytes)!; } } Manipulador de Requisições Processa mensagens recebidas: public class GreetingHandler(ILogger logger) : RequestHandler { public override Greeting Handle(Greeting command) { logger.LogInformation("Olá, {Name}!", command.Name); return base.Handle(command); } } Configurando Brighter com SQL Server Passo 1: Configuração do Banco de Dados Crie uma tabela para armazenar mensagens (ex: QueueData): CREATE TABLE [dbo].[QueueData]( [Id] BIGINT IDENTITY(1,1) PRIMARY KEY, [Topic] NVARCHAR(255) NOT NULL, [MessageType] NVARCHAR(1024) NOT NULL, [Payload] NVARCHAR(MAX) NOT NULL ); CREATE NONCLUSTERED INDEX [IX_Topic] ON [dbo].[QueueData] ([Topic]); Passo 2: Configuração da Conexão Defina as configurações em C#: var sqlConfig = new MsSqlConfiguration( connectionString: "", queueStoreTable: "QueueData" // Tabela criada acima ); Passo 3: Configuração do Consumidor Inscreva-se em uma fila do SQL Server: .AddServiceActivator(opt => { opt.Subscriptions = [ new MsSqlSubscription( subscriptionName: new SubscriptionName("greeting-subscription"), channelName: new ChannelName("greeting.topic"), // Mapeia para a coluna Topic isAsync: false // Defina como true para manipuladores assíncronos ) ]; opt.ChannelFactory = new ChannelFactory(new MsSqlMessageConsumerFactory(sqlConfig)); }); Passo 4: Configuração do Produtor Publique eventos no SQL Server: .UseExternalBus(new MsSqlProducerRegistryFactory(sqlConfig, new[] { new Publication { Topic = new RoutingKey("greeting.topic") } }).Create()); Considerações Importantes Propriedade do Esquema: A tabela QueueData e os índices devem ser criados manualmente. O Brighter não gera schemas automaticamente. Desempenho: O SQL Server não é otimizado para mensageria de alto throughput. Use-o em cenários leves ou para prototipagem. Conclusão A integração do Brighter com o SQL Server oferece uma solução pragmática para mensageria em aplicações .NET onde brokers dedicados não estão disponíveis. Aproveitando as garantias transacionais do SQL Server, essa abordagem garante entrega confiável de mensagens com infraestrutura mínima. Para ambientes de produção, combine-a com monitoramento (ex: SQL Server Profiler) e estratégias de tratamento de erros. Referência Repositório GitHub

Apr 29, 2025 - 09:13
 0
Integração do Brighter com Microsoft SQL Server

Introdução ao Microsoft SQL Server

O Microsoft SQL Server é um sistema robusto de gerenciamento de banco de dados relacional (RDBMS), amplamente adotado em ecossistemas .NET. Embora tradicionalmente usado para armazenamento transacional, o SQL Server também pode atuar como broker de mensagens em sistemas distribuídos. O Brighter—uma biblioteca de processamento de comandos—suporta o SQL Server como backend de mensageria, oferecendo uma solução pragmática para cenários onde implantar brokers dedicados (como RabbitMQ ou Kafka) é inviável (ex: projetos pequenos ou ambientes legados).

Requisitos

Recapitulação do Brighter

Antes de configurar o SQL Server, relembre conceitos essenciais 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 com um único destinatário (ex: EnviarEmail).
  • Eventos: Notificações para múltiplos consumidores (ex: PedidoEnviado).

Mapeador de Mensagens

Converte mensagens do Brighter para 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", // Tópico de destino
            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 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);
    }
}

Configurando Brighter com SQL Server

Passo 1: Configuração do Banco de Dados

Crie uma tabela para armazenar mensagens (ex: QueueData):

CREATE TABLE [dbo].[QueueData](
    [Id] BIGINT IDENTITY(1,1) PRIMARY KEY,
    [Topic] NVARCHAR(255) NOT NULL,
    [MessageType] NVARCHAR(1024) NOT NULL,
    [Payload] NVARCHAR(MAX) NOT NULL
);
CREATE NONCLUSTERED INDEX [IX_Topic] ON [dbo].[QueueData] ([Topic]);

Passo 2: Configuração da Conexão

Defina as configurações em C#:

var sqlConfig = new MsSqlConfiguration(
    connectionString: "",
    queueStoreTable: "QueueData" // Tabela criada acima
);

Passo 3: Configuração do Consumidor

Inscreva-se em uma fila do SQL Server:

.AddServiceActivator(opt =>
{
    opt.Subscriptions = [
        new MsSqlSubscription<Greeting>(
            subscriptionName: new SubscriptionName("greeting-subscription"),
            channelName: new ChannelName("greeting.topic"), // Mapeia para a coluna Topic
            isAsync: false // Defina como true para manipuladores assíncronos
        )
    ];
    opt.ChannelFactory = new ChannelFactory(new MsSqlMessageConsumerFactory(sqlConfig));
});

Passo 4: Configuração do Produtor

Publique eventos no SQL Server:

.UseExternalBus(new MsSqlProducerRegistryFactory(sqlConfig, new[]
{
    new Publication
    {
        Topic = new RoutingKey("greeting.topic")
    }
}).Create());

Considerações Importantes

  • Propriedade do Esquema: A tabela QueueData e os índices devem ser criados manualmente. O Brighter não gera schemas automaticamente.
  • Desempenho: O SQL Server não é otimizado para mensageria de alto throughput. Use-o em cenários leves ou para prototipagem.

Conclusão

A integração do Brighter com o SQL Server oferece uma solução pragmática para mensageria em aplicações .NET onde brokers dedicados não estão disponíveis. Aproveitando as garantias transacionais do SQL Server, essa abordagem garante entrega confiável de mensagens com infraestrutura mínima. Para ambientes de produção, combine-a com monitoramento (ex: SQL Server Profiler) e estratégias de tratamento de erros.

Referência

Repositório GitHub