Brighter 与 Microsoft SQL Server 的集成

本文将重点讲解如何将 Brighter 与 Microsoft SQL Server 集成。

Microsoft SQL Server 简介


Microsoft SQL Server 是一种强大的关系型数据库管理系统(RDBMS),在 .NET 生态系统中被广泛采用。虽然它传统上用于事务性数据存储,但在分布式系统中也可以充当消息代理。Brighter(一个命令处理库)支持将 SQL Server 作为消息传递后端,为无法部署专用代理(如 RabbitMQ 或 Kafka)的场景提供了实用解决方案(例如小型项目或遗留环境)。

环境要求

  1. .NET 8 或更高版本
  2. .NET 项目需引用以下 NuGet 包:
    • Paramore.Brighter.MessagingGateway.MsSql:启用 SQL Server 作为消息代理。
    • Paramore.Brighter.ServiceActivator.Extensions.DependencyInjection:连接 Brighter 与 AWS 消息服务。
    • Paramore.Brighter.ServiceActivator.Extensions.Hosting:将 Brighter 托管为后台服务
    • Serilog.AspNetCore:结构化日志记录(可选但推荐)

Brighter 快速回顾

在继续 SQL Server 配置前,先回顾 Brighter 的核心概念。

请求(Command/Event)


使用 IRequest 定义消息:  

public class Greeting : Event(Guid.NewGuid())
{
    public string Name { get; set; } = string.Empty;
}
  • 命令(Commands):单接收者操作(如 SendEmail)
  • 事件(Events):广播通知(如 `OrderShipped`)。

消息映射器(Message Mapper)

在 Brighter 消息与应用对象之间进行转换: 

public class GreetingMapper : IAmAMessageMapper
{
    public Message MapToMessage(Greeting request)
    {
        var header = new MessageHeader();
        header.Id = request.Id; 
        header.TimeStamp = DateTime.UtcNow;
        header.Topic = "greeting.topic"; // 目标主题名称
        header.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)!;
    }
}

请求处理器(Request Handler)

处理传入的消息:  

public class GreetingHandler(ILogger logger) : RequestHandler
{
    public override Greeting Handle(Greeting command)
    {
        logger.LogInformation("Hello {Name}", command.Name);
        return base.Handle(command);
    }
}

配置 Brighter 与 SQL Server 

步骤 1:数据库设置


创建存储消息的表(例如 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]);

步骤 2:配置 SQL Server 连接

在 C# 中定义连接设置:  

var sqlConfig = new MsSqlConfiguration(
    connectionString: "",
    queueStoreTable: "QueueData" // 上一步创建的表
);

步骤 3:消费者配置


订阅 SQL Server 队列:

.AddServiceActivator(opt =>
{
    opt.Subscriptions = [
        new MsSqlSubscription(
            subscriptionName: new SubscriptionName("greeting-subscription"),
            channelName: new ChannelName("greeting.topic"), // 映射到 Topic 列
            isAsync: false // 若使用异步处理器则设为 true
        )
    ];
    opt.ChannelFactory = new ChannelFactory(new MsSqlMessageConsumerFactory(sqlConfig));
});

步骤 4:生产者配置  

向 SQL Server 发布事件:  

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

注意事项

  • 架构所有权:必须手动创建 QueueData 表和索引。Brighter 不会自动生成架构。
  • 性能:SQL Server 不是为高吞吐量消息传递优化的。建议仅用于轻量级场景或原型开发。

结论

Brighter 的 SQL Server 集成方案为 .NET 应用提供了实用的消息传递解决方案,尤其在无法部署专用代理的场景下。通过利用 SQL Server 的事务性保证,该方案可在最小化基础设施开销的同时确保可靠的消息传递。对于生产环境,建议结合监控工具(如 SQL Server Profiler)和错误处理策略。

参考资料

GitHub 仓库:连接到 SQL Server 的示例代码

你可能感兴趣的:(c#,.net,brighter,sqlserver)