繁体   English   中英

Azure存储队列-空触发

[英]Azure Storage Queue - Trigger on empty

我有一个Nodejs Azure函数读取存储队列,每天都要填充一次。 处理完所有消息并将结果存储在表中后,我想调用最终函数,对收集的数据进行一些处理。

实现此目标的最佳方法是什么? 我可以在nodejs绑定内的队列中获取其余消息吗? 我是否必须通过nodejs azure sdk来查看队列? 队列为空时可以触发其他功能吗?

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

  1. 尝试新的耐用功能预览( https://azure.github.io/azure-functions-durable-extension/ )。 正是针对这种情况。
  2. 在每个工作人员队列消息的末尾,找出它是否是“最后”消息。 即,如果您要向表中写入唯一行,则只需扫描表,看看它是否完整。 (如果表很大,显然是不可行的)。
  3. 维持柜台。 每个队列消息都会减少计数器。 递减为0的家伙是“最后一个”。 这可能会很痛苦,因为没有一种自动减少共享计数器的好方法。 您可以做一些etag魔术,或通过让每个工作人员在表中写一行,将其简化为案例2。

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

但是,对于分布式事件驱动的体系结构(无服务器体系结构),当每个业务处理器(功能/微服务/等)可以触发诸如ScheduleMessage之类的Watchdog事件(例如30秒)时,可以使用分布式Watchdog帮助一种模式。 在这段时间内,可以取消或重新触发此看门狗事件,否则,在看门狗队列/主题实体中将看到看门狗事件消息。

看门狗用法非常简单。 您的QueueTrigger函数正在发送“看门狗事件”消息以指示业务处理。 如果此业务流程已完成,则不会再触发看门狗,并且它将在其配置的时间(30s)之后过期,因此其阅读器/订阅者可以看到“看门狗事件”消息。

以下屏幕片段显示了此模型:

看门狗

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

如果Azure服务总线实体队列/主题内置了这种看门狗并具有重新触发已经安排好的消息的功能,那么这将很好,因此我们可以为所有业务流程/任务保留相同的序列号。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM