2017-03-02 113 views
2

我對Azure隊列,函數和Worker的功能有一些疑問。我不確定這是如何工作的。Azure隊列 - 功能 - 消息可見性 - 工作者?

場景:

  • Q-通知處於Azure存儲帳戶的隊列。
  • f-process-notification是Azure中與q-notifications綁定的函數。它的工作是在隊列中獲得第一條消息並處理它。

理論上,當消息被添加到q-notifications時,應該調用函數f-process-notification。

問題:

  1. 是否觸發功能代替需要有工?換句話說,每次將消息放入隊列中時都會調用f-process-notification。

  2. 假設我在可見性超時爲5分鐘的隊列中放置消息。基本上我排隊的消息,但它不應該採取行動,直到5分鐘過去。當消息放入隊列時,隊列是否會立即觸發f-process-notification,或者只有在消息變爲可見時(即將隊列放入隊列後5分鐘)纔會觸發f-process-notification?

回答

3

在Azure函數中,運行您的隊列觸發函數的每個函數應用程序實例都將擁有其自己的目標隊列偵聽器。它使用指數退避策略監控隊列中的新工作。當新項目添加到隊列中時,監聽器將從隊列中提取多個項目(批處理行爲是可配置的),然後將並行發送到您的函數。如果您的功能成功,該消息將被刪除,否則它將保留在隊列中進行重新處理。要回答您的問題 - 是的,我們尊重您指定的任何知名度超時。如果消息以超過5分鐘的時間添加,則只會在此之後處理。

關於擴展 - 當你的Function App的N個實例正在運行時,它們將全部合作處理隊列。每個隊列偵聽器將獨立地將批量消息從隊列中拉出來處理。實際上,這些工作將在N個實例中進行負載平衡。正是你想要的:) Azure函數在幕後爲你實現了多重消費者/工作者模式的所有複雜性。

+1

您提到規模......出於好奇,Azure函數將如何確定如何縮放我的隊列觸發功能應用程序託管在App Service上?隊列文檔沒有提到縮放(https://docs.microsoft.com/zh-cn/azure/azure-functions/functions-bindings-storage-queue),而「運行時」部分則集中在「消費計劃」(https:// docs.microsoft.com/en-us/azure/azure-functions/functions-scale)。 –

+2

在消費中,我們監控目標隊列,應用基於隊列長度的啓發式,等待消息的年齡等,以確定您的功能是否「保持」。如果不是,我們添加更多的實例來減小隊列大小。在非消費中,您可以預先確定有多少實例正在運行。 – mathewc

+0

您是否可以使用App Service託管模型在一個虛擬機中使用同一個Function App的多個實例?或者它每個VM實例一個? –

0

我通常使用偵聽器邏輯而不是觸發器。消費者不斷地監視隊列中的消息。如果您有多個使用者,例如處理相同總線/隊列的不同Azure輔助角色中的消費代碼有5個實例,則獲得消息的第一個消費者將獲勝(他們是「競爭對手」)。這提供了SOA體系結構中常見的擴展場景。

本文介紹延遲處理的一些方法。

http://markheath.net/post/defer-processing-azure-service-bus-message

好運!