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

Azure Service Bus订阅能否同步接收消息?对应场景有何更优处理方案?

可行的替代方案

下面列出几种比新增额外Topic成本更低、维护更简单的实现方式:

方案1:利用订阅规则+消息自定义属性实现条件投递

无需新增任何Service Bus资源,复用现有Topic和订阅即可实现:

  • 先调整两个订阅的匹配规则:
    • 订阅1保留默认全匹配规则的基础上,新增一条排除规则:过滤掉携带Func1Processed = true自定义属性的消息
    • 关闭订阅2的默认全匹配规则,新增一条自定义规则:仅当消息携带Func1Processed = true的自定义属性时才会匹配投递给订阅2
  • 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 13:48:04