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

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<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.