如何配置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
相关产品推荐
相关产品推荐

