Azure存储队列 - 触发空

时间:2017-11-11 12:18:06

标签: node.js azure azure-functions azure-storage-queues

我有一个nodejs Azure函数读取存储队列,每天填充一次。当所有消息都已处理完毕并且结果存储在表格中时,我想调用最终函数来处理收集的数据。

实现这一目标的最佳方法是什么?我可以在nodejs绑定中的队列中获取剩余的消息吗?我是否必须通过nodejs azure sdk查看队列?当队列空了时,我可以触发不同的功能吗?

2 个答案:

答案 0 :(得分:1)

这是一个经典的“加入”问题。有几种方法可以解决这个问题:

  1. 尝试新的Durable Function预览(https://azure.github.io/azure-functions-durable-extension/)。这正是出于这种情况。
  2. 在每个工作队列消息的末尾,确定它是否是“最后一个”。即,如果您正在向表中写入唯一的行,只需扫描该表并查看它是否完整。 (如果它是一张大桌子,这显然是不可行的)。
  3. 维持一个柜台。每个队列消息递减计数器。递减到0的人是“最后一个”。这可能是一种痛苦,因为没有一种很好的方式来原子地减少共享计数器。你可以做一些etag魔术,或者通过让每个工作者向表写一行来将其简化为#2。

答案 1 :(得分:1)

您的业务场景的问题是该函数如何知道接收的消息是队列中的最后一个消息。没有直接的属性/方法来获取此值,例如队列中的许多可见消息。 你的问题很有意思,你问的是"触发器是空的"。与"触发消息"相比,在队列中实现这种事件并不容易。

然而,对于分布式事件驱动架构(无服务器架构)可以帮助使用分布式 Watchdog 的模式,当每个业务处理器(函数/微服务/等)可以触发看门狗事件时,例如例如,ScheduleMessage,30秒。在这段时间内,可以取消或重新触发此看门狗事件,否则看门狗事件消息将在看门狗队列/主题实体中可见。

您的案例的看门狗用法非常简单。您的QueueTrigger函数正在发送监视程序事件消息以指示业务处理。如果此业务流程已完成,则看门狗不再被重新触发,并且在配置的时间(30秒)后将过期,因此看门狗事件消息对于其读取器/订户是可见的。

以下屏幕截图显示了此模型:

watchdog

如您所见,Watchdog基于Azure Service Bus Schedule / CancelScheduled消息。没有类似RetriggerScheduledMessage的东西,基本上服务总线实体中的重新触发预定消息是基于其序列号在 CancelScheduledMessage 这两个步骤中完成的,并使用 ScheduleMessage创建新的消息 call(新序列号)。 处理这些步骤在QueueTrigger函数调用中作为Watchdog完成,带有Lease Blob,用于保存ScheduleMessage的计数器和序列号。

如果Azure Service Bus实体队列/主题内置了这种具有重新触发已调度消息的能力的Watchdog,那将是很好的,因此我们可以保留相同的序列号所有业务流程/任务。

无论如何,如果你对这个看门狗功能感兴趣,我可以用C#中的实现来更新我的答案。