Durable Functions 最佳做法和診斷工具
本文詳細說明使用 Durable Functions 時的一些最佳做法。 另外也描述各種工具,以協助診斷開發、測試和生產環境使用期間的問題。
最佳作法
使用最新版的 Durable Functions 延伸模組和 SDK
函數應用程式會使用兩個元件來執行 Durable Functions。 其中一個是 Durable Functions SDK,可讓您使用目標程式設計語言撰寫協調器、活動和實體函式。 另一個是 Durable 擴充功能,這是實際執行程式碼的執行階段元件。 除了 .NET 內含式應用程式之外,SDK 和擴充功能會獨立建立版本。
掌握最新的擴充功能和 SDK,可確保您的應用程式受益於最新的效能改進、功能和錯誤修正。 升級至最新版本也可確保 Microsoft 可以收集最新的診斷遙測,以協助您在向 Azure 開啟支援案例時加速調查程序。
- 如需取得最新延伸模組版本的指示,請參閱升級 Durable Functions 延伸模組版本。
- 若要確保您使用的是最新版本的 SDK,請檢查您所使用語言的套件管理員。
遵守 Durable Functions 程式碼條件約束
協調器程式碼的重新執行行為會建立可以在協調器函式中撰寫的程式碼類型其條件約束。 條件約束的範例是您的協調器函式必須使用決定性 API,以便每次重新執行時,都會產生相同的結果。
注意
Durable Functions Roslyn Analyzer 是即時程式碼分析器,可引導 C# 使用者遵守 Durable Functions 特定的程式碼條件約束。 如需如何在 Visual Studio 和 Visual Studio Code 上啟用 Durable Functions Roslyn Analyzer 的指示,請參閱 Durable Functions Roslyn Analyzer。
熟悉程式設計語言的 Azure Functions 效能設定
使用預設設定時,您選取的語言執行階段可能對函式施以嚴格的並行限制。 例如:只允許一次在指定的 VM 上執行 1 個函式。 透過微調語言的並行和效能設定,通常可以放寬這些限制。 如果您想要將 Durable Functions 應用程式的效能最佳化,則必須熟悉這些設定。
以下是一些語言的非詳盡清單,這些語言通常受益於微調其效能和並行設定,以及其此做法的指導方針。
保證每個應用程式的唯一工作中樞名稱
多個 Durable Function 應用程式可以共用相同的儲存體帳戶。 根據預設,應用程式的名稱會當做工作中樞名稱使用,以確保不會發生意外共用工作中樞。 如果您需要在 host.json 中明確設定應用程式的工作中樞名稱,則您必須確定名稱是唯一的。 否則,多個應用程式將競爭訊息,這可能會導致未定義的行為,包括協調流程意外「停滯」處於 [擱置] 或 [執行中] 狀態。
唯一的例外狀況是,如果您在多個區域中部署相同應用程式的複本;在此情況下,您可以針對複本使用相同的工作中樞。
將程式碼變更部署至執行協調器時,請遵循指引
在應用程式的存留期之中,必然會新增、移除和變更函式。 常見中斷性變更的範例包括變更活動或實體函式簽章,以及變更協調器邏輯。 這些變更在影響仍在執行的協調流程時會發生問題。 如果部署不正確,程式碼變更可能會導致協調流程失敗,並出現非決定性的錯誤、無限期停滯、效能降低等。在進行可能會影響執行協調流程的程式碼變更時,請參閱建議的緩和策略。
盡可能縮小函式輸入和輸出
如果您提供 Durable Functions API 的大型輸入和輸出,則可能會遇到記憶體問題。
Durable Functions API 的輸入和輸出會序列化為協調流程歷程記錄。 這表示,大型輸入和輸出可能會隨著時間大幅致使協調器歷程記錄無限制成長,這可能會導致在重新執行期間發生記憶體例外狀況的風險。
若要減輕大型輸入和輸出對 API 的影響,您可以選擇將某些工作委派給子協調器。 這有助於將歷程記錄記憶體負擔從單一協調器負載平衡到多個協調器,因此將個別歷程記錄的記憶體保持在低使用量。
也就是說,處理大型資料的最佳做法,是將其保留在外部儲存體中,並在必要時,只在活動內將該資料具體化。 採用這種方法時,您可以傳入一些輕量型識別碼,讓您在活動中視需要從外部儲存體擷取該資料,而不是將資料本身當做 Durable Functions API 的輸入和輸出進行通訊。
讓實體資料保持很小
就像對 Durable Functions API 的輸入和輸出一樣,如果實體的明確狀態太大,您可能會遇到記憶體問題。 特別是,實體狀態必須針對任何要求從儲存體序列化和取消序列化,因此大型狀態會將序列化延遲新增至每個引動過程。 因此,如果實體需要追蹤大型資料,建議您將資料卸載至外部儲存體,並在實體中追蹤某個輕量型識別碼,以便在需要時從儲存體具體化資料。
微調您的 Durable Functions 並行設定
單一背景工作角色能同時執行多個工作項目,以提高效率。 不過,同時處理太多工作項目時,可能會有耗盡資源的風險,例如 CPU 容量、網路連線等。在許多情況下,這不應該是個問題,因為系統會自動為您處理調整和限制工作項目。 也就是說,如果您遇到效能問題 (例如協調器花費太多時間才能完成、停滯在擱置中等),或正在執行效能測試,您可以在 host.json 檔案中設定並行限制。
注意
這不是在 Azure Functions 中微調語言執行階段效能和並行設定的替代項目。 Durable Functions 並行設定只會判斷一次可指派給指定 VM 的工作量,但不會判斷在 VM 內處理該工作的平行處理原則程度。 後者需要微調語言執行階段效能設定。
對外部事件使用唯一名稱
如同活動函式,外部事件具有「至少一次」傳遞保證。 這表示,在某些「罕見」情況下 (可能會在重新啟動、調整、當機等期間發生),您的應用程式可能會收到相同外部事件的重複項目。 因此,我們建議外部事件包含一個識別碼,讓它們以手動方式在協調器中刪除重複資料。
注意
不同於預設 Azure 儲存體的儲存體提供者,MSSQL 儲存體提供者會以交易方式取用外部事件並更新協調器狀態,因此在該後端中,應該不會有重複事件的風險。 也就是說,仍建議外部事件有唯一名稱,以便跨後端移植該程式碼。
投資壓力測試
如同任何效能相關項目,應用程式的理想並行設定和架構最終取決於應用程式的工作負載。 因此,建議使用者投資效能測試控管,以模擬其預期的工作負載,並使用它來執行其應用程式的效能和可靠性實驗。
避免輸入、輸出和例外狀況中有敏感性資料
Durable Functions API 的輸入和輸出 (包含例外狀況) 會永久保存在您選擇的儲存體提供者中。 如果這些輸入、輸出或例外狀況包含敏感性資料(例如秘密、連接字串、個人識別資訊等),則任何具有儲存體提供者資源讀取權限的人都能夠取得它們。 若要安全地處理敏感性資料,建議使用者從 Azure Key Vault 的活動函式或環境變數內擷取該資料,而且絕不會將該資料直接傳達給協調器或實體。 這應該有助於防止敏感性資料外洩到您的儲存體資源。
注意
本指南也適用於 CallHttp
協調器 API,此 API 也會將其要求和回應承載保存在儲存體中。 如果目標 HTTP 端點需要驗證 (這可能很敏感),則建議使用者在活動內自行實作 HTTP 呼叫,或使用 CallHttp
所提供的內建受控識別支援,而該驗證不會將任何認證保存至儲存體。
提示
同樣地,避免記錄包含秘密的資料,因為任何具有記錄讀取權限的人 (例如 Application Insights 中),都能夠取得這些秘密。
診斷工具
有數個工具可協助您診斷問題。
Durable Functions 和 Durable Task Framework 記錄
Durable Functions 延伸模組
Durable 延伸模組會發出「追蹤事件」,可讓您追蹤協調流程的端對端執行。 您可以使用 Azure 入口網站中的 Application Insights Analytics 工具尋找及查詢這些追蹤事件。 您可以在 host.json 檔案的 logger
(Functions 1.x) 或 logging
(Functions 2.0) 區段中,設定所發出追蹤資料的詳細程度。 請參閱組態詳細資料。
Durable 工作架構
從 Durable 延伸模組 v2.3.0 開始,基礎長期工作架構 (DTFx) 發出的記錄也可供收集。 請參閱如何啟用這些記錄的詳細資料。
Azure 入口網站
診斷並解決問題
Azure 函數應用程式診斷是 Azure 入口網站上實用的資源,可用來監視和診斷應用程式中的潛在問題。 其也提供建議,以協助根據診斷解決問題。 請參閱 Azure 函數應用程式診斷。
Durable Functions 協調流程追蹤
Azure 入口網站提供協調流程追蹤詳細資料,協助您了解每個協調流程執行個體的狀態,以及追蹤端對端執行。 當您查看 Azure Functions 應用程式內的函式清單時,會看到包含追蹤連結的 [監視器] 資料行。 您必須為應用程式啟用 Applications Insights,才能取得這項資訊。
Durable Functions 監視器延伸模組
這是 Visual Studio Code 延伸模組,可提供 UI 來監視、管理及偵錯協調流程執行個體。
Roslyn 分析器
Durable Functions Roslyn Analyzer 是即時程式碼分析器,可引導 C# 使用者遵守 Durable Functions 特定的程式碼條件約束。 如需如何在 Visual Studio 和 Visual Studio Code 上啟用 Durable Functions Roslyn Analyzer 的指示,請參閱 Durable Functions Roslyn Analyzer。
支援
如需問題和支援,您可以在下列其中一個 GitHub 存放庫中提出問題。 在 Azure 中報告錯誤時,包括受影響的執行個體識別碼、顯示問題的 UTC 時間範圍、應用程式名稱 (可能的話) 和部署區域將會大幅加快調查速度。