簡體   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