如何从不同区域的两个Azure Service Bus读取消息并作为同一源处理
多区域Azure Service Bus同主题并行消费官方功能说明
目前微软官方发布的各语言Azure Service Bus SDK,均没有内置跨多区域同名topic/subscription同时拉取消息、统一投递到业务层的原生功能。
你之前调研的两类官方方案均不匹配你的使用场景:
- 官方异地灾备(Geo-DR)属于主备切换模式,正常运行状态下只会从主区域拉取消息,仅当主区域完全故障触发切流后才会从备区域读取,无法实现同时消费两个区域的消息
- 跨区域联邦与消息复制是服务端层面的消息同步逻辑,需要配置复制规则将一个区域的消息同步到其他区域,本质还是单客户端连接单个命名空间消费,会产生额外的复制成本,也不符合你直接在客户端双拉的诉求
你可以基于官方SDK自行实现该逻辑,实现成本很低,可参考以下思路:
- 为每个区域的Service Bus命名空间分别初始化独立的
ServiceBusClient实例,传入对应区域的连接字符串 - 对每个
ServiceBusClient实例的同名topic/subscription,创建独立的ServiceBusProcessor消息处理器 - 所有处理器绑定同一个消息处理回调函数,两边拉取到的消息都会进入相同的业务处理逻辑,上层业务完全不需要感知消息的来源区域
- 可单独配置每个区域处理器的异常处理逻辑,单个区域的连接故障不会影响另一个区域的正常消费
实现时注意做好消费幂等即可,避免极端情况下跨区域消息重复投递带来的业务异常。
内容的提问来源于stack exchange,提问作者Dan Csharpster
相关产品推荐
相关产品推荐

