NServiceBus AzureServiceBusTransport仅为单个事件创建SQL过滤器问题
环境信息
- NServiceBus 版本: 7.5.0
- .NET 版本: 5
问题根因
单条订阅规则覆盖问题的核心是SubscriptionRuleNamingConvention配置错误:
你当前的规则对所有事件类型都返回固定的options.Prefix + options.TopicName作为规则名称,而Azure Service Bus 要求同一个订阅下的规则名称必须唯一,NServiceBus新增订阅规则时如果检测到同名规则会直接覆盖原有内容,因此最终只会保留最后扫描到的那个事件对应的过滤规则。
你观察到「调整项目结构后规则匹配的事件会变化」的现象也符合该逻辑:事件类型的扫描顺序变化后,最后被注册的事件类型就会替换之前的同名规则。
你之前调整事件约定、切换为原生IEvent接口、调整项目结构、移除Saga持久化都未生效,是因为这些操作都没有解决规则名重复的核心问题,和事件识别逻辑本身无关。
解决方案
修改SubscriptionRuleNamingConvention的配置逻辑,确保每个事件类型对应唯一的规则名称,同时保留你需要的长度限制逻辑即可,参考配置如下:
transport.SubscriptionRuleNamingConvention(eventType => { // 为每个事件生成专属规则名,替换非法字符后做长度截断 var ruleName = $"{options.Prefix}_{eventType.FullName.Replace(".", "_")}"; return LimitNumberCharactersTopicName(ruleName); });
注意:Azure Service Bus 订阅规则名称有字符和特殊字符限制,转换时建议把类型名中的
.替换为下划线等合法字符,避免规则创建失败。
验证步骤
- 先删除Azure Service Bus 主题下原有出问题的订阅
- 重启服务,EnableInstallers会自动重新创建订阅和所有事件对应的规则,此时每个事件都会对应一条独立的SqlFilter规则,不会再出现覆盖
- 确认订阅下的规则数量和你项目中需要消费的事件数量一致即可
内容的提问来源于stack exchange,提问作者Serberuss
相关产品推荐
相关产品推荐

