Service Bus Topic消息死信后是否会从所有订阅中移除?
Azure Service Bus Topic 订阅运行逻辑解答
核心规则
- 同一个Service Bus Topic下的所有订阅都是完全独立的实体,各自持有独立的消息副本、独立的死信队列,针对单个订阅的消息操作不会对其他订阅产生任何影响。
对应问题的明确答复
当一条消息同时匹配订阅A、订阅B的筛选规则时,消息进入Topic的瞬间,服务端就会给两个订阅各存一份完全独立的消息副本,两个订阅并不是共享同一条消息实体。
基于这个底层逻辑:
- 当Webjob从订阅A拾取该消息、并将其移入订阅A的死信队列时,这个操作只会作用在订阅A持有的那份消息副本上,订阅B里的对应消息副本绝对不会被同步移除,会正常留在订阅B的活动消息队列里,等待订阅B的消费者处理,直到消息过期、被订阅B的消费者正常消费完成、或是被移入订阅B自己的死信队列。
- Service Bus的每个Topic订阅都有专属的独立死信队列,不存在Topic级别的公共死信队列。所有死信队列都是绑定到具体实体的专属资源:普通的Service Bus队列有自己的独立死信队列,每个Topic订阅的死信队列也和其他订阅完全隔离,存在某个订阅死信队列里的消息,只能在对应订阅的死信实体下查到,不会串到其他订阅的队列里。
这个逻辑很容易通过最小测试验证:建一个测试用的Topic,加两个默认匹配所有消息的测试订阅,发1条测试消息后,先把订阅A里的消息移到死信,再分别查两个订阅的活动消息数、死信消息数,就能看到订阅B的活动消息数还是1,死信数是0,和上面说的逻辑完全一致。
内容的提问来源于stack exchange,提问作者Oztaco
相关产品推荐
相关产品推荐

