2017-04-20 25 views
1

如何在Azure應用服務的多個橫向擴展實例上分發任務?在擴展Azure應用服務時分發工作

任務將從一個隊列中讀取數據,每個隊列聚合一分鐘,然後將結果寫入Blob存儲區。

我的任務目標是這些:

  • 應該只有在任何時候每個隊列一個任務運行。
  • 在所有實例中均勻分配任務
  • 如果有一個實例出現故障,那麼所有在那裏運行的任務都將在另一個正在運行的實例上啓動。
  • 一旦實例返回,實例將被均勻分發。

我主要關心的不是工作負載性能,而是響應性/正常運行時間。 單個實例可以託管所有任務,但如果該實例重新啓動,則會導致不需要的停機時間。

回答

1

根據我對您的要求的理解,我認爲您不希望每個隊列都運行一個任務。如果你的任務失敗了,這會引入一個失敗點。

相反,請考慮使用連續的WebJobs。您可以將所有WebJobs放在應用程序服務計劃中的單個Web App上,然後將Web App擴展爲兩個或更多實例。因此,如果您有WebJobs A,B和C監控隊列1,2和3,然後創建第二個Web應用程序實例,您將擁有WebJobs A1和A2監控隊列1.如果出現故障,另一個出現故障在另一個實例正在恢復時鬆弛。

此外,如果您要求至少傳遞一次消息並且不超過一次,我建議使用服務總線隊列。查看WebJobs的ServiceBusTrigger。請注意,當特定WebJob實例將服務總線隊列消息出隊時,該消息將被鎖定,以便不會處理兩次。

爲了減少響應時間(如果您的隊列備份),您可以添加更多Web App實例。您還可以將Web App的自動縮放比例設置爲取決於隊列長度,因此您可以根據隊列是否開始備份來自動放大和縮小。

+0

我打算使用服務總線隊列,仍然閱讀它。 我的想法是偷看5分鐘,將它們聚合並將其存儲在一個blob中。然後在隊列中標記這些項目已完成。如果進程崩潰,下一個會重新啓動,重新啓動的工作量將可以接受。問題/目標不是大數據,而是實時數據。 – hultqvist

+0

我可能會實時處理這些消息。服務總線隊列可以以兩種模式工作:查看並鎖定或接收和刪除。如果您使用Peek&Lock,則Peek操作會使消息在給定時段內不可見。成功處理郵件後,您將明確從隊列中刪除郵件。這樣,如果您的WebJob在處理過程中崩潰,則鎖定過期並且消息變爲可見再次處理。 –

+0

@hultqvist,我原來的答案有錯誤。對於使用服務總線觸發器,Webjob類型應該是連續的。我已經相應地更新了我的答案。 –

相關問題