You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置Wolverine+SQL Server实现非竞争发布订阅模式?

解决Wolverine SQL Server传输的非竞争订阅者配置问题

你当前的配置采用**队列(Queue)模式,队列的特性是单条消息仅被一个消费者处理,因此多个订阅者监听同一队列会形成竞争。要实现发布/订阅模式(每个订阅者都能收到所有消息),需改用Wolverine的主题-订阅(Topic-Subscription)**机制,给每个订阅者分配独立的订阅队列,让Wolverine自动将主题消息复制到所有关联的订阅队列中。

修改步骤

1. 发布者配置修改

将原队列发布改为主题发布,确保消息发送到SQL Server主题而非队列:

return await Host.CreateDefaultBuilder(args)
    .UseWolverine(opts =>
    {
        const string connectionString = "Data Source=vpc-chma;Initial Catalog=Test;Integrated Security=True;TrustServerCertificate=True;";

        opts.UseSqlServerPersistenceAndTransport(connectionString, "myapp")
            .AutoProvision()
            .AutoPurgeOnStartup();

        // 将消息发布到SQL Server主题,替代原队列发布
        opts.PublishAllMessages().ToSqlServerTopic("outbound_topic");

        opts.Services.AddHostedService<Worker>();
    })
    .RunOaktonCommands(args);

2. 第一个订阅者配置修改

创建专属的订阅队列,并关联到目标主题,确保该订阅者从自己的队列接收消息:

return await Host.CreateDefaultBuilder(args)
    .UseWolverine(opts =>
    {
        const string connectionString = "Data Source=vpc-chma;Initial Catalog=Test;Integrated Security=True;TrustServerCertificate=True;";

        opts.UseSqlServerPersistenceAndTransport(connectionString, "myapp")
            .AutoProvision()
            .AutoPurgeOnStartup();

        // 监听专属订阅队列,并关联到目标主题
        opts.ListenToSqlServerQueue("subscriber1_queue")
            .ForTopic("outbound_topic");
    })
    .RunOaktonCommands(args);

3. 第二个订阅者配置修改

同理,创建另一专属订阅队列并关联相同主题,避免与第一个订阅者竞争:

return await Host.CreateDefaultBuilder(args)
    .UseWolverine(opts =>
    {
        const string connectionString = "Data Source=vpc-chma;Initial Catalog=Test;Integrated Security=True;TrustServerCertificate=True;";

        opts.UseSqlServerPersistenceAndTransport(connectionString, "myapp")
            .AutoProvision()
            .AutoPurgeOnStartup();

        // 使用独立的订阅队列接收主题消息
        opts.ListenToSqlServerQueue("subscriber2_queue")
            .ForTopic("outbound_topic");
    })
    .RunOaktonCommands(args);

原理说明

  • 主题(Topic):作为消息的发布源头,接收发布者发送的消息。
  • 订阅队列(Subscription Queue):每个订阅者拥有独立队列,Wolverine会自动将主题中的消息复制到所有关联的订阅队列。
  • 由于每个订阅者从专属队列消费消息,不存在消息争抢,所有订阅者都会收到发布者发送的每一条消息。

内容的提问来源于stack exchange,提问作者CHMaagaard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 09:32:47