可靠 Azure Functions 的最佳做法

Azure Functions 是事件取向的隨選計算體驗,可擴充現有的 Azure App Service 應用程式平台,使其可實作由 Azure、第三方 Azure 服務和內部部署系統內事件所觸發的程式碼。 Functions 可讓您藉由連線到資料來源或傳訊解決方案來組建解決方案,讓您更輕鬆地處理和回應事件。 Functions 在 Azure 資料中心上執行,這些資料中心極為複雜,具備許多整合元件。 在裝載的雲端環境中,VM 可能會偶爾重新啟動或移動,且系統會升級。 函數應用程式可能也相依於外部 API、Azure 服務和其他資料庫,這些資料庫也很容易出現週期性的不穩定。

本文詳細介紹了設計和部署高效率函數應用程式的最佳做法,這些應用程式在雲端式環境中可維持健全狀態且效能良好。

選擇正確的主控方案

在 Azure 中建立函數應用程式時,必須為應用程式選擇主控方案。 您選擇的方案會影響效能、可靠性和成本。 Azure Functions 有三個可用的基本主控方案:

所有主控方案在執行 Linux 或 Windows 上都是正式發行 (GA)。

在 App Service 平台的內容中,用來動態裝載函式的進階方案為彈性進階方案 (EP)。 還有其他稱為「進階」的專用 (App Service) 方案。 若要深入了解,請參閱進階方案一文。

您選擇的主控方案會決定下列行為:

  • 如何根據需求調整您的函數應用程式,以及如何管理執行個體配置。
  • 每個函式應用程式執行個體可用的資源。
  • 支援進階功能,例如 Azure 虛擬網路連線。

若要深入了解如何選擇正確的主控方案,以及方案之間的詳細比較,請參閱 Azure Functions 主控選項

當您建立函數應用程式時,請務必選擇正確的方案。 Functions 提供有限的主控方案切換,主要介於使用量方案與彈性進階方案之間。 若要深入了解,請參閱方案移轉

正確設定儲存體

Functions 需要儲存體帳戶與您的函數應用程式相關聯。 Functions 主機會使用儲存體帳戶連線進行作業,例如管理觸發程序和記錄函式執行。 它也會在動態調整函數應用程式時使用。 若要深入了解,請參閱 Azure Functions 儲存體考量事項

函數應用程式中設定錯誤的檔案系統或儲存體帳戶可能會影響函式效能和可用性。 如需協助針對未正確設定儲存體的帳戶進行疑難排解,請參閱儲存體疑難排解一文。

儲存體連線設定

動態調整的函數應用程式可從儲存體帳戶中的 Azure 檔案儲存體端點,或從與擴增執行個體相關聯的檔案伺服器執行。 此行為是由下列應用程式設定控制:

只有當您在 Windows 上的進階方案或使用量方案中執行時,才支援這些設定。

當您在 Azure 入口網站、使用 Azure CLI 或 Azure PowerShell 建立函數應用程式時,系統會視需要為函數應用程式建立這些設定。 當您從 Azure Resource Manager 範本建立資源 (ARM 範本) 時,您也必須將 WEBSITE_CONTENTAZUREFILECONNECTIONSTRING 包含在範本中。

在您首次使用 ARM 範本進行部署時,請勿包含 WEBSITE_CONTENTSHARE,這是由系統為您產生的。

您可以使用下列 ARM 範本的範例來協助您正確進行這些設定:

儲存體帳戶組態

建立函數應用程式時,您必須建立或連結支援 Blob、「佇列」及「表格」儲存體的一般用途「Azure 儲存體」帳戶。 Azure Functions 需依賴 Azure 儲存體來進行作業,例如管理觸發程序和記錄函式執行。 您可以在 AzureWebJobsStorageWEBSITE_CONTENTAZUREFILECONNECTIONSTRING 應用程式設定中找到函數應用程式的儲存體帳戶連接字串。

建立此儲存體帳戶時,請記住下列考量:

  • 若要減少延遲,請在與函數應用程式相同的區域中建立儲存體帳戶。

  • 若要改善生產中的效能,請針對每個函數應用程式使用個別的儲存體帳戶。 這尤其適用於 Durable Functions 和事件中樞觸發函式。

  • 針對事件中樞觸發的函式,請勿使用已啟用 Data Lake Storage 的帳戶。

處理大型資料集

在 Linux 上執行時,您可以掛接檔案共用以新增額外的儲存體。 掛接共用是函式處理大型現有資料集的便利方式。 若要深入了解,請參閱掛接檔案共用

組織函式

作為解決方案的一部分,您可能會開發及發佈多個函式。 這些函式通常會合併成單一函數應用程式,但也可以在不同的函數應用程式中執行。 在進階與專用 (App Service) 主控方案中,多個函數應用程式也可以藉由在同一個方案中執行來共用相同的資源。 如何將函式與函數應用程式分組,可能會影響整體解決方案的效能、規模、設定、部署與安全性。

針對使用量和進階方案,函數應用程式中的所有函式都會動態調整。

如需了解如何組織函式的詳細資訊,請參閱函式組織最佳做法

最佳化部署

部署函數應用程式時,請務必記住 Azure 中函式的部署單位是函數應用程式。 函數應用程式中的所有函式都會同時部署,通常是來自相同的部署套件。

請考慮這些選項以成功部署:

  • 讓您的函式從部署套件執行。 從套件方法執行可提供下列優點:

    • 減少檔案複製鎖定問題的風險。
    • 可直接部署至生產應用程式,觸發重新啟動。
    • 知道套件中的所有檔案都可供應用程式使用。
    • 改善 ARM 範本部署效能。
    • 可縮短冷啟動時間,特別是針對具有大型 npm 套件樹狀結構的 JavaScript 函式。
  • 請考慮使用持續部署,將部署連線至原始檔控制解決方案。 持續部署也可讓您從部署套件執行。

  • 針對進階方案裝載,請考慮新增暖機觸發程序,以減少新增執行個體時的延遲。 若要深入了解,請參閱 Azure Functions 暖機觸發程序

  • 若要盡可能減少部署停機時間,並能夠復原部署,請考慮使用部署位置。 若要深入了解,請參閱 Azure Functions 部署位置

撰寫強固的函式

您可以遵循數個設計準則,來撰寫助於提升一般效能和函式可用性的函式程式碼。 指導準則包括:

因為暫時性失敗在雲端運算中很常見,所以您應該在存取雲端式資源時使用重試模式。 許多觸發程式和繫結都已經實作重試。

安全性設計

安全性最好是在規劃階段期間加以考量,而非等到函式準備好執行時。 若要了解如何安全開發和部署函式,請參閱保護 Azure Functions

考慮並行

隨著傳入事件而產生函數應用程式需求,因此會擴大在使用量和進階方案中執行的函數應用程式。請務必了解函數應用程式如何回應負載,以及如何設定觸發程序來處理傳入事件。 如需一般概觀,請參閱 Azure Functions 中的事件驅動縮放

專用 (App Service) 方案則會要求您提供函數應用程式的擴增。

背景工作處理序計數

在某些情況下,在擴增之前,在執行個體中建立多個程序 (稱為語言背景工作處理序) 可以更有效率地處理負載。允許的語言背景工作處理序數目上限是由 FUNCTIONS_WORKER_PROCESS_COUNT 設定所控制。 此設定的預設值為 1,這表示不會使用多個處理序。 達到處理序數目上限之後,函數應用程式會擴增至更多執行個體以處理負載。 此設定不適用於在主機處理序中執行的 C# 類別庫函式

在進階方案或專用 (App Service) 方案上使用 FUNCTIONS_WORKER_PROCESS_COUNT 時,請留意方案所提供的核心數目。 例如,進階方案 EP2 提供兩個核心,因此您應該從值 2 開始,並視需要增加兩個,至到達上限為止。

觸發程式設定

規劃輸送量和縮放比例時,請務必了解不同類型的觸發程式如何處理事件。 有些觸發程式可讓您控制批次處理行為,以及管理並行。 經常調整這些選項中的值,可協助每個執行個體針對所叫用函式的需求進行適當調整。 這些組態選項會套用至函數應用程式中的所有觸發程式,並在應用程式的 host.json 檔案中維護。 如需設定詳細資料,請參閱特定觸發程式參考的設定一節。

若要深入了解 Functions 如何處理訊息資料流程,請參閱 Azure Functions 可靠的事件處理

規劃連線

使用量方案中執行的函數應用程式受限於連線限制。 這些限制會根據每個執行個體強制執行。 基於這些限制和一般最佳做法,您應該從函式程式碼最佳化輸出連線。 若要深入了解,請參閱管理 Azure Functions 中的連線

語言特定考量

針對您選擇的語言,請留意下列考量:

最大化可用性

冷啟動是無伺服器架構的重要考量。 若要深入了解,請參閱冷啟動。 如果冷啟動是適用於您案例的考量,您可以在了解無伺服器冷啟動文章中找到更深入的探討。

進階方案是在維持動態縮放的同時減少冷啟動的建議方案。 您可以使用下列指引來減少冷啟動,並改善這三個主控方案中的可用性。

計畫 指引
進階方案 在您的函數應用程式中實作暖機觸發程式
設定 Always-Ready 執行個體和最大高載限制的值
• 在虛擬網路上使用非 HTTP 觸發程式時,請使用虛擬網路觸發程式支援
專用方案 在至少兩個已啟用 Azure App Service 健全狀況檢查的執行個體上執行
實作自動縮放
取用方案 • 檢閱您對繫結和觸發程式的 singleton 模式和並行設定的使用,以避免人為限制函數應用程式的縮放方式。
檢閱可限制擴增的 functionAppScaleLimit 設定
• 在開發和測試期間檢查每日使用量配額 (GB/秒) 限制。 請考慮在生產環境中移除此限制。

有效監視

Azure Functions 提供與 Azure Application Insights 的內建整合,監視函式執行及程式碼的撰寫追蹤。 若要深入了解,請參閱監視 Azure Functions。 Azure 監視器也提供設備以監視函數應用程式本身的健康情況。 若要深入了解,請參閱使用 Azure 監視器進行監視

使用 Application Insights 整合來監視函式時,您應該注意下列考量:

  • 請確定已移除 AzureWebJobsDashboard 應用程式設定。 舊版 Azure Functions 支援此設定。 如果存在,移除 AzureWebJobsDashboard 可改善函式效能。

  • 檢閱 Application Insights 記錄。 如果您預期可見的資料遺失,請考慮調整取樣設定,以更妥善地掌握您的監視案例。 您可以使用 excludedTypes 設定從取樣中排除特定類型,例如 RequestException。 若要深入了解,請參閱設定取樣

Azure Functions 也可讓您將系統產生和使用者產生的記錄,傳送至 Azure 監視器記錄。 與 Azure 監視器記錄的整合目前處於預覽狀態。

組建備援

您的商務需求可能會要求函式始終保持可用,即使在資料中心中斷期間。 若要了解如何使用多重區域方法來保持重要功能持續執行,請參閱 Azure Functions 異地災害復原和高可用性

下一步

管理函數應用程式