Azure 服务总线 - 以延迟状态将消息添加到队列

Azure Service Bus - Add a message to the queue in a deferred state

我想知道是否可以将代理消息发送到消息已经处于延迟状态的 queue/topic?

我问这个是因为我目前有一个流程执行以下操作...

  1. 进程启动并将代理消息发送到队列(这会触发一个函数,该函数将消息正文作为实体记录在 table 存储中,状态为 'Processing')。
  2. 过程中完成了额外的工作
  3. 如果我们顺利结束流程,另一条代理消息将连同完成消息一起发送到队列(这会触发使用 table 存储更新实体的相同函数 'Complete'状态)。

虽然此方法大部分有效,但感觉笨拙且脆弱。我真的很希望能够将消息发送到队列,然后让最后一步使消息在队列中可见,以便它可以被函数(持久函数)使用。

我考虑过设置 ScheduledEnqueueTimeUtc,但我无法保证该过程何时完成(我在这里考虑的是最坏的情况),所以我不确定要设置多长时间。

我还查看了 BrokeredMessageDefer 选项,但它似乎只能从接收器设置,而不是最初处于延迟状态。

我尝试使用服务总线中转消息可以实现吗?我可以将预定入队时间设置得非常长(例如 2 小时),如果达到该时间,它会自动过期并移至死信队列吗?我是否应该将初始消息发送到死信队列,然后在该过程完成后检索并重新提交?

有没有人有过实施这样的过程的经验...发送开始消息,并且仅在收到完成通知后才处理该消息?我需要它尽可能稳健,因为我在此过程中处理金融交易。

希望我的解释有道理。

I'm wondering if it is possible to send a brokered message to a queue/topic where the message is already in a deferred state?

这不可能。您只能延迟一条全新的消息,而不能延迟它。延迟要求先接收消息才能具有 SequenceNumber.

使用 ScheduledEnqueueTimeUtc 有一些挑战,因为您将在以后发送它,但一旦处理结束就无法取消。相反,您可以利用 QueueClient.ScheduleMessageAsync() returns 立即返回 SequenceNumber。这样您可以将消息设置到很远的将来,但如果处理较早完成,也可以取消它。

我最终通过保留发送两条消息的过程解决了这个问题,但是重构了我的持久函数以记录消息在Table Storage中,检查两条消息是否都已收到,如果收到,添加一个发给 Azure Queue Storage 的新消息。第二个函数侦听启动其进程的队列。

经过多次测试,这似乎是一个非常可靠的解决方案。两条消息以什么顺序到达,或者它们需要多长时间都无关紧要......只要它们都到达了,那就是第二个函数启动的时间。