[英]Azure Durable Function: Fan Out vs. Parallel.ForEachAsync
我必須在項目列表上運行 function。 我正在使用 Azure Durable Functions,並且可以使用它們的扇出/扇入策略並行運行這些項目。
但是,我想知道這樣做與在單個 Activity function 中使用新的Parallel.ForEachAsync
方法之間存在什么區別。我需要使用 Durable 函數,因為這是一個永恆的編排,在完成時重新啟動。
Parallel.ForEachAsync
綁定到一個 Function App 實例。 這意味着它綁定到 Function App 擁有的資源。 在消耗計划中運行時,這意味着 1 個 vCPU。
當使用 Durable Functions 的扇出/扇入方法時,F2 的每個實例(見圖片)都是它自己的 Function App 實例。 這反過來又可以使用分配給它的全部資源。
簡而言之:使用扇出/扇入方法,您正在使用(很多)更多資源。 可能會給您更快的結果。
最好將兩者結合起來:分批工作分派給“F2”,以並行方式處理分批工作。
扇出工作分配給
F2
function 的多個實例。使用動態任務列表跟蹤工作。Task.WhenAll
以等待所有調用的函數完成。 然后,F2
function 輸出從動態任務列表中聚合並傳遞給F3
function。在
Task.WhenAll
的await
調用中發生的自動檢查點確保潛在的中途崩潰或重新啟動不需要重新啟動已經完成的任務。
對我來說,主要區別在於 Durable Functions 將為您處理失敗/重試:
在 Task.WhenAll 的 await 調用中發生的自動檢查點確保潛在的中途崩潰或重新啟動不需要重新啟動已經完成的任務。
在極少數情況下,在活動 function 完成后但在其完成保存到編排歷史記錄之前,window 中可能會發生崩潰。 如果發生這種情況,活動 function 將在進程恢復后從頭開始重新運行。
混合和完整性的另一個區別; 並行活動的管理。
通過耐用的扇出/扇入,您擁有大量內置的管理控制。
首先,您可以通過host.json
文件中的配置輕松控制並行進程的數量,其次,您可以通過管理 API 來管理/監控並行活動的進度。
當您訪問具有限制的資源時,第一個可能會有所幫助,例如受限的 API,因此它不會被太多請求淹沒或超過 API 處理並行請求的效率。 以下hosts.json
示例將持久任務限制為 9 個並發活動:
{
"version": "2.0",
"functionTimeout": "00:10:00",
"extensions": {
"durableTask": {
"hubName": "<your-hub-name-here",
"maxConcurrentActivityFunctions": 9
},
"logging" : {
...
}
}
這將命名您的集線器並限制並發活動。
然后對於實例管理,您可以查詢和終止活動實例以及向它們發送消息並清除實例歷史記錄。 如果您需要知道活動何時完成,尤其是如果您需要知道每個已完成活動的成功/失敗狀態,這種功能將非常有用。 這有助於可靠地啟動依賴於所有活動完成的下游流程。 @Thiago 提到了重試; 當使用內置的重試機制時,管理 API 真正發揮作用以監控正在運行的活動。 它對於構建可靠的彈性和處理 stream 進程非常有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.