Azure 服务总线 - 取消或重新安排没有序列号的预定消息

Azure Service Bus - Cancel or reschedule scheduled message without Sequence number

我有一个实体,可以说是一个经常被用户更新的文档(又名实时保存)。一旦更新延迟 5 分钟(这可能表明用户很可能停止编辑文档),就需要对该文档执行一些非关键但耗时的工作。比方说预览生成并计算一些统计数据。换句话说,我需要某种去抖动机制。

我的想法是在每次更新 ASB 队列后发送一条预定消息,以在 5 分钟内传送并取消之前的消息。我可以将文档 guid 作为 MessageId 传递以识别上一条消息。但是,我找不到取消先前消息的方法,因为 API 需要传递从先前调度接收到的序列 ID,我不想将它存储在数据库中,因为它必须放弃无状态的想法服务和数据库的存在实际上使 ASB 变得多余。

到目前为止,我计划将调度与重复数据删除一起使用。它几乎解决了我的问题,但并不完全是我想要的。它具有节流行为(拾取第一条消息,然后在特定时间段内忽略具有相同 MessageId 的其他消息),而我需要去抖动。

还有一个选项 full scan of queue with Peek 方法,但在生产中似乎不推荐这种方法。

谢谢Sean Feldman。将您的建议作为答案发布,以帮助其他社区成员。

不,您不能在不知道序列号的情况下取消或重新安排已安排的消息。

When you schedule messages and know you would need to cancel some of those, you should hold on to the SequenceNumber returned back when scheduling using client.CancelScheduledMessageAsync(sequenceNumber).

可以参考, Azure Service Bus - Canceling Scheduled Messages and Azure Service Bus Essentials — Scheduled Messages