逐一处理服务总线队列消息

Processing Service Bus Queue Messages One-By-One

我对 Azure 服务总线队列 比较陌生,正在构建一个项目,该项目需要按照消息到达的顺序 (FIFO) 处理队列中的消息。

使用 Microsoft 的文档,我能够弄清楚那部分。据我了解,我需要为队列打开会话吗?

我正在努力解决的问题是确定什么是对队列执行以下一组有序任务的最佳方法/服务堆栈。

首先假设我们有一个基于 FIFO 的服务总线队列,其中包含 n 条消息。我会怎样:

  1. 从队列中取出第一条消息。
  2. 使用 Azure 函数.
  3. 处理消息
  4. 将负载发送到 IoT 中心,该负载将传送到外部设备 (C2D)。
  5. 这是我想不通的部分...等待 Completed 指标到 return 来自 IoT 中心 等到 TTL 过期以接收传出的 IoT 中心消息。
  6. 现在完成队列中的项目。
  7. 从 1 开始。

我想也许 Logic App 可以帮助我实现我想要做的事情。在#4 之前,一切似乎都很简单。我不知道如何使用逻辑应用程序 1. 等到 IoT 中心确认 Cloud-to-Device 消息已发送或已过期 2. 不处理下一个队列中的消息,直到收到 IoT 中心确认 我已将当前队列消息标记为完成。

请注意:我对此如此具体的原因是接收传出 IoT 中心 C2D 消息的设备关心顺序。如果他们收到乱序的消​​息,就会中断进程。

非常感谢任何建议。

带会话的 Azure 服务总线队列可用于实现消息的有序处理。

从问题中,我了解到只有在收到来自 IOT Hub 的确认后,才应删除来自服务总线队列的消息。

我能感觉到这个流程可能会出现问题。

首先,您需要了解Service Bus Queue中的lock duration 属性。根据为此 属性 设置的值,消息将被锁定 x 分钟或秒。每当从队列接收到消息时,都会为该消息应用锁。这样消息将在 x 分钟或秒内对任何其他接收者不可用。 Complete 操作应该在锁过期之前发生。一旦锁过期,消息将可供其他接收者处理。在您的情况下,同一个 Azure 函数有机会再次接收消息(导致重复)

可以为锁定持续时间设置的最大值 属性 是 5 分钟。

因此,如果您确定 IOT Hub 在 5 分钟内响应,则可以继续执行此实施。尽管如此,仍然没有让函数知道何时处理下一条消息的选项。