Azure 服务总线 - 取消或重新安排没有序列号的预定消息
Posted
技术标签:
【中文标题】Azure 服务总线 - 取消或重新安排没有序列号的预定消息【英文标题】:Azure Service Bus - Cancel or reschedule scheduled message without Sequence number 【发布时间】:2021-12-23 04:06:12 【问题描述】:我有一个实体,比如说一个用户经常更新的文档(又名实时保存)。一旦更新延迟 5 分钟,这可能表明用户很可能停止编辑文档,则需要为该文档执行一些非关键但耗时的工作。假设预览生成并计算一些统计数据。换句话说,我需要某种去抖动机制。
我的想法是在每次更新 ASB 队列后发送预定消息,以在 5 分钟内交付并取消前一个消息。我可以将文档 guid 作为 MessageId 传递以识别以前的消息。但是,我找不到取消先前消息的方法,因为 API 需要传递从先前调度接收到的序列 ID,并且我不想将其存储在数据库中,因为它必须放弃无状态服务的想法和存在DB 实际上使 ASB 变得多余。
到目前为止,我计划将调度与重复数据删除一起使用。它几乎解决了我的问题,但并不完全符合我的要求。它具有节流行为(第一条消息被拾取,然后在一段时间内忽略具有相同 MessageId 的其他消息),而我需要去抖动。
还有full scan of queue with Peek 方法的选项,但在生产中似乎不推荐使用这种方法。
【问题讨论】:
【参考方案1】:谢谢Sean Feldman。发布您的建议作为帮助其他社区成员的答案。
不,您不能在不知道序列号的情况下取消或重新安排已安排的消息。
当您安排消息并知道您需要取消其中一些消息时,您应该保留在使用
client.CancelScheduledMessageAsync(sequenceNumber)
安排时返回的SequenceNumber
。
您可以参考Is there a way to cancel ALL scheduled messages in azure service bus topic without knowing their sequence numbers?、Azure Service Bus - Canceling Scheduled Messages和Azure Service Bus Essentials — Scheduled Messages
【讨论】:
这太糟糕了。由于 ASB 已经通过 MessageId 具有重复数据删除机制,因此它在没有任何明显技术原因的情况下使生活复杂化。 您可以通过raise support ticket、Twitter @AzureSupport 向Microsoft 报告,也可以在Microsoft Q&A 上提出相同的问题以上是关于Azure 服务总线 - 取消或重新安排没有序列号的预定消息的主要内容,如果未能解决你的问题,请参考以下文章