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

时间:2018-10-05 05:25:32

标签: azure azure-functions azureservicebus azure-logic-apps azure-servicebus-queues

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

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

我正在努力确定要对队列执行以下一组有序任务的最佳方法/服务堆栈。

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

  1. 从队列中提取第一条消息。
  2. 使用 Azure函数处理消息。
  3. 将有效负载发送到IoT中心,该负载将传递到外部设备(C2D)。
  4. 这是我不知道的部分 ...等待已完成指示器从物联网中心返回等待TTL过期以传出IoT中心消息。
  5. 现在完成队列中的项目。
  6. 从1开始。

我想也许 Logic App 可能会帮助我实现我试图做的事情。一切似乎直截了当直到#4。我无法弄清楚如何使用逻辑应用程序1.等待IoT中心确认 Cloud-to-Device 消息已发送或已过期,然后等待2.不要处理该应用中的下一条消息。排队直到收到IoT中心确认并且,我已将当前队列消息标记为已完成。

请注意:我之所以如此具体,是因为接收到传出的IoT中心C2D消息的设备关心订单。如果他们接收到的邮件混乱,则将导致该过程中断。

任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:1)

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

从这个问题中,我可以理解,只有在从IOT集线器收到确认后,才应删除来自服务总线队列的消息。

我可以感觉到此流程可能发生的问题。

首先,您需要了解Service Bus Queue中的lock duration属性。根据设置为此属性的值,邮件将被锁定x分钟或几秒钟。每当从队列接收到一条消息时,将对该消息应用锁定。因此,该消息在x分钟或几秒钟内将无法用于任何其他接收者。 Complete操作应在锁过期之前进行。一旦锁定过期,该消息将可供其他接收者处理。对于您而言,同一个Azure函数有可能再次接收到消息(导致重复)

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

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