Azure Service Bus订阅能否同步接收消息?对应场景有何更优处理方案?
可行的替代方案
下面列出几种比新增额外Topic成本更低、维护更简单的实现方式:
方案1:利用订阅规则+消息自定义属性实现条件投递
无需新增任何Service Bus资源,复用现有Topic和订阅即可实现:
- 先调整两个订阅的匹配规则:
- 订阅1保留默认全匹配规则的基础上,新增一条排除规则:过滤掉携带
Func1Processed = true自定义属性的消息 - 关闭订阅2的默认全匹配规则,新增一条自定义规则:仅当消息携带
Func1Processed = true的自定义属性时才会匹配投递给订阅2
- 订阅1保留默认全匹配规则的基础上,新增一条排除规则:过滤掉携带
- Azure Function 1处理完业务逻辑后,调用Service Bus API给原消息添加
Func1Processed = true的属性,重新提交到原Topic即可 - 同一条消息的MessageId保持不变,可直接做幂等校验,避免重复处理
优点:改造成本极低,仅调整现有配置即可完成,原有订阅的监控、告警配置都可以直接复用。
注意点:需要在Function 1处理逻辑中做好异常捕获,只有处理成功才更新属性重新投递,处理失败直接送入死信队列即可。
方案2:使用Durable Functions编排工作流
如果业务后续可能扩展多步骤依赖,直接用Durable Functions做流程编排是最省心的选择:
- 去掉原有两个Service Bus触发的Function,改用一个新的Service Bus触发的协调器函数(Orchestrator Function)
- 协调器按顺序先调用原Function 1的业务逻辑,等执行成功后再调用原Function 2的业务逻辑
- Durable Functions自带状态管理,自动处理重试、异常回滚逻辑,不需要自行维护消息的处理状态
优点:完全不需要修改Service Bus侧的任何配置,后续如果要新增步骤、调整依赖顺序仅需修改编排逻辑即可,可扩展性极强。
适用场景:业务流程后续可能迭代、依赖关系可能变化的场景。
方案3:利用Service Bus会话(Session)实现顺序控制
如果消息本身就有按业务ID分组的需求,可以用会话实现:
- 给原Topic开启会话支持,同一条消息的SessionId设置为业务唯一ID(比如订单ID)
- Azure Function 1开启会话支持,消费订阅1的消息,处理完成后向会话中写入处理完成的标记
- Azure Function 2同样开启会话支持,消费订阅2的消息时先读取会话中的标记,确认Func1处理完成后再执行业务逻辑,否则将消息延迟一段时间后重新放回队列
优点:适合消息本身就需要按业务分组处理的场景,状态保存在会话中不需要额外存储。
缺点:需要额外处理消息重试延迟的逻辑,适合对实时性要求不是极高的场景。
内容的提问来源于stack exchange,提问作者wickjon
相关产品推荐
相关产品推荐

