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 服务总线 - 取消或重新安排没有序列号的预定消息的主要内容,如果未能解决你的问题,请参考以下文章

从死信队列重新提交消息 - Azure 服务总线

在本地测试 Azure 服务总线,无需任何订阅或登录

发件人停止运行时 Azure 服务总线队列 ScheduledEnqueueTimeUtc 的行为

如何删除 Azure 服务总线主题上的死信消息

如何记录 Azure 服务总线访问?

Azure 服务总线与服务远程处理、HTTP 和 WCF