【问题标题】:Azure Service Bus - Add a message to the queue in a deferred stateAzure 服务总线 - 将消息添加到处于延迟状态的队列
【发布时间】:2019-02-01 02:13:00
【问题描述】:

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

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

  1. 进程启动并将中间消息发送到队列(这会触发一个函数,该函数将消息正文作为一个实体记录在表存储中,并处于“处理中”状态)。
  2. 在此过程中完成了其他工作
  3. 如果我们在没有任何问题的情况下结束流程,则会将另一条代理消息发送到队列中并带有完成消息(这会触发将表存储中的实体更新为“完成”状态的相同功能)。

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

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

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

我正在尝试对服务总线代理消息执行什么操作?我是否可以将 Scheduled Enqueue 时间设置为如此长的时间(例如 2 小时),如果达到该时间,它会自动过期并移至死信队列?我是否应该将初始消息发送到死信队列,然后在该过程完成后检索它并重新提交?

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

希望我的解释是有道理的。

【问题讨论】:

    标签: azure azureservicebus azure-servicebus-queues brokeredmessage


    【解决方案1】:

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

    这是不可能的。您只能延迟一条全新的消息,而不能推迟它。延迟需要首先收到一条消息,以便它具有SequenceNumber

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-01
        • 2017-07-28
        • 2014-06-10
        • 2014-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多