Durable Functions 儲存提供者

Durable Functions 是由 Durable Task Framework (DTFx) 在內部提供的一組 Azure Functions 觸發程序和繫結。 DTFx 支援各種後端儲存體提供者,包括 Durable Functions 使用的 Azure 儲存體提供者。 從 Durable Functions v2.5.0 開始,使用者可以將其函數應用程式設定為使用 DTFx 儲存體提供者,而非 Azure 儲存體提供者。

注意

對於許多函式應用程式,適用於 Durable Functions 的預設 Azure 儲存體提供者可能已足夠,且亦最容易使用,因其不需進行額外設定。 不過,成本、可擴縮性,以及資料管理權衡可能有利於使用替代儲存體提供者。

已開發兩個替代儲存體提供者來用於 Durable Functions 和 Durable Task Framework,即 Netherite 儲存體提供者和 Microsoft SQL Server (MSSQL) 儲存體提供者。 本文說明所有這三個支援的提供者、相互比較,並提供如何開始使用的基本資訊。

注意

目前無法在兩個儲存體提供者之間移轉資料。 如果要使用新的儲存體提供者,您應該建立新的應用程式並設定為使用新的儲存體提供者。

Azure 儲存體

Azure 儲存體是 Durable Functions 的預設儲存體提供者。 此服務使用佇列、資料表及 Blob 來保存協調流程和實體狀態。 也使用 Blob 和 Blob 租用來管理分割區。 在許多情況下,用來儲存 Durable Functions 執行階段狀態的儲存體帳戶與 Azure Functions 使用的預設儲存體帳戶 (AzureWebJobsStorage) 相同。 但也可以將 Durable Functions 設定為使用另外的儲存體帳戶。 Azure 儲存體提供者內建於 Durable Functions 延伸模組,沒有任何其他相依性。

Azure 儲存體提供者的主要優點包括:

  • 不需要設定 - 您可以使用函數應用程式設定體驗為您建立的儲存體帳戶。
  • 最低成本無伺服器計費模型 - Azure 儲存體採用基於使用情況的定價模式,完全以使用量為基礎 (詳細資訊)。
  • 最佳工具支援 - Azure 儲存體提供跨平臺的本機模擬,並與 Visual Studio、Visual Studio Code 和 Azure Functions Core Tools 整合。
  • 最成熟 - Azure 儲存體是 Durable Functions 的原始又最經得起考驗的儲存體後端。
  • 預覽支援使用身分識別 (而不是秘密) 來連線至儲存體提供者。

您可以在 Azure/durabletask GitHub 存放庫中找到「Azure 儲存體」儲存體提供者的 DTFx 元件原始程式碼。

注意

使用 Azure 儲存體提供者時,需要標準一般用途 Azure 儲存體帳戶。 不支援其他所有儲存體帳戶類型。 強烈建議使用舊版 v1 一般用途儲存體帳戶,因為就 Durable Functions 工作負載而言,較新的 v2 儲存體帳戶可能費用太高。 如需 Azure 儲存體帳戶類型的詳細資訊,請參閱儲存體帳戶概觀一文。

Netherite

Netherite 儲存體後端由 Microsoft Research 設計和開發。 除了 Azure 分頁 Blob,還使用 Azure 事件中樞FASTER 資料庫技術。 Netherite 設計可處理的協調流程和實體輸送量遠高於其他提供者。 在某些基準情節中,顯示的輸送量比預設 Azure 儲存體提供者還多一個數量級。

Netherite 儲存體提供者的主要優點包括:

  • 輸送量明顯高於其他儲存體提供者,成本也較低。
  • 支援性價比最佳化,可讓您視需要擴大效能。
  • 使用事件中樞基本和標準 SKU 時,支援多達 32 個資料分割。
  • 在高輸送量工作負載下,比其他提供者更符合成本效益。

您可以在 Netherite 文件中深入了解 Netherite 儲存體提供者的技術詳細資料,包括如何開始使用。 您可以在 microsoft/durabletask-netherite GitHub 存放庫中找到 Netherite 儲存體提供者的原始程式碼。 下列研究論文也提供 Netherite 儲存體提供者的更深入評估:Serverless Workflows with Durable Functions and Netherite

注意

Netherite 名稱源自 Minecraft 世界。

Microsoft SQL Server (MSSQL)

Microsoft SQL Server (MSSQL) 儲存體提供者將所有狀態保存到 Microsoft SQL Server 資料庫中。 與內部部署和雲端裝載的 SQL Server 部署相容,包括 Azure SQL Database

MSSQL 儲存體提供者的主要優點包括:

  • 支援中斷連線的環境 - 使用 SQL Server 安裝時不需要 Azure 連線能力。
  • 跨多個環境和雲端的可攜性,包括 Azure 裝載和內部部署。
  • 強大的資料一致性,支援備份/還原和容錯移轉,不會遺失資料。
  • 自訂資料加密的原生支援 (SQL Server 的功能)。
  • 透過內建預存程序,與現有的資料庫應用程式整合。

您可以在 Microsoft SQL 提供者文件中深入了解 MSSQL 儲存體提供者的技術詳細資料,包括如何開始使用。 您可以在 microsoft/durabletask-mssql GitHub 存放庫中找到 MSSQL 儲存體提供者的原始程式碼。

設定替代儲存體提供者

設定替代儲存體提供者通常分成兩個步驟:

  1. 將適當的 NuGet 套件新增至函數應用程式 (對於使用延伸模組套件組合的應用程式,此為暫時性需求)。
  2. 更新 host.json 檔案來指定您要使用的儲存體提供者。

如果未在 host.json 中明確設定任何儲存體提供者,則預設會啟用 Azure 儲存體提供者。

設定 Azure 儲存體提供者

Azure 儲存體提供者是預設儲存體提供者,不需要任何明確的設定、NuGet 套件參考或延伸模組套件組合參考。 您可以在這裡extensions/durableTask/storageProvider 路徑下,找到整套 host.json 組態選項。

連線

host.json 中的 connectionName 屬性是環境組態的參考,指定應用程式如何連線到 Azure 儲存體。 此屬性可以指定:

如果設定的值與單一設定完全相符,又與其他設定的開頭相符,則會使用完全相符項目。 如果 host.json 中未指定任何值,預設值為 "AzureWebJobsStorage"。

身分識別型連線

如果您使用 2.7.0 版或更新版本的延伸模組及 Azure 儲存體提供者,而不是使用連接字串與祕密,則可以讓應用程式使用 Microsoft Entra 身分識別。 若要執行此動作,您會在對應至觸發程序和繫結設定中 connectionName 屬性的通用前置詞下定義設定。

若要針對 Durable Functions 使用身分識別型連線,請進行下列應用程式設定:

屬性 環境變數範本 描述 範例值
Blob 服務 URI <CONNECTION_NAME_PREFIX>__blobServiceUri 儲存體帳戶 Blob 服務的資料平面 URI,使用 HTTPS 配置。 https://<storage_account_name>.blob.core.windows.net
佇列服務 URI <CONNECTION_NAME_PREFIX>__queueServiceUri 儲存體帳戶佇列服務的資料平面 URI,使用 HTTPS 配置。 https://<storage_account_name>.queue.core.windows.net
資料表服務 URI <CONNECTION_NAME_PREFIX>__tableServiceUri 儲存體帳戶資料表服務的資料平面 URI,使用 HTTPS 配置。 https://<storage_account_name>.table.core.windows.net

還可以設定其他屬性來自訂連線。 請參閱身分識別型連線的通用屬性

主控於 Azure Functions 服務時,以身分識別為基礎的連接會使用受控識別。 雖然可以使用 credentialclientID 屬性指定使用者指派的身分識別,但預設會使用系統指派的身分識別。 請注意,支援以資源識別碼來設定使用者指派的身分識別。 在本機開發等其他內容中執行時,雖然這可以自訂,但仍會改用您的開發人員身分識別。 請參閱使用身分識別型連線進行本機開發

授與權限給身分識別

正在使用的任何身分識別,都必須具有執行預期動作的權限。 有關大多數 Azure 服務,意即您需要指派 Azure RBAC 的角色,利用提供這些權限的內建或自訂角色。

重要

部分權限可能會由所有內容都不需要的目標服務公開。 可以的話,請遵循最低權限原則,只授與身分識別所需的權限。 例如,如果應用程式只需要能夠讀取資料來源,請使用只有讀取權限的角色。 不宜指派也允許寫入該服務的角色,因為讀取作業不需要這麼多權限。 同樣地,最好確保角色指派的範圍僅限於需要讀取的資源。

您必須建立可在執行階段存取 Azure 儲存體的角色指派。 擁有者之類的管理角色不足夠。 在正常作業中使用 Durable Functions 延伸模組時,建議使用下列內建角色:

您的應用程式可能會根據您撰寫的程式碼而要求更多的權限。 如果您使用預設行為,或將 connectionName 明確設定為 "AzureWebJobsStorage",請參閱使用身分識別連線到主機儲存體,以了解其他權限考量。

設定 Netherite 儲存體提供者

啟用 Netherite 儲存體提供者需要在 host.json 中進行設定變更。 若是 C# 使用者,也需要額外的安裝步驟。

host.json 組態

下列 host.json 範例顯示啟用 Netherite 儲存體提供者所需的最小設定。

{
  "version": "2.0",
  "extensions": {
    "durableTask": {
      "storageProvider": {
        "type": "Netherite",
        "storageConnectionName": "AzureWebJobsStorage",
        "eventHubsConnectionName": "EventHubsConnection"
      }
    }
  }
}

如需更詳細的安裝指示,請參閱 Netherite 使用者入門文件

安裝 Netherite 延伸模組 (僅限.NET)

注意

如果應用程式使用的是延伸模組套件組合,您應忽略本節,因為延伸模組套件組合可免除手動管理延伸模組的需要。

您必須在 NuGet 上安裝最新版的 Netherite 延伸模組。 這通常表示在 .csproj 檔案中包含其參考,以及建置專案。

要安裝的延伸模組套件取決於所使用的 .NET 背景工作角色:

設定 MSSQL 儲存體提供者

啟用 MSSQL 儲存體提供者需要在 host.json 中進行設定變更。 若是 C# 使用者,也需要額外的安裝步驟。

host.json 組態

下列範例顯示啟用 MSSQL 儲存體提供者所需的最小設定。

{
  "version": "2.0",
  "extensions": {
    "durableTask": {
      "storageProvider": {
        "type": "mssql",
        "connectionStringName": "SQLDB_Connection"
      }
    }
  }
}

如需更詳細的安裝指示,請參閱 MSSQL 提供者的使用者入門文件

安裝長期工作 MSSQL 延伸模組 (僅限.NET)

注意

如果應用程式使用的是延伸模組套件組合,您應忽略本節,因為延伸模組套件組合可免除手動管理延伸模組的需要。

您必須在 NuGet 上安裝最新版的 MSSQL 儲存體提供者延伸模組。 這通常表示在 .csproj 檔案中包含其參考,以及建置專案。

要安裝的延伸模組套件取決於所使用的 .NET 背景工作角色:

比較儲存體提供者

各種支援的儲存體提供者之間有許多重大取捨。 下表可用來協助您了解這些取捨,並決定哪一個儲存體提供者最符合您的需求。

儲存體提供者 Azure 儲存體 Netherite MSSQL
官方支援狀態 ✅ 正式發行 (GA) ✅ 正式發行 (GA) ✅ 正式發行 (GA)
外部相依性 Azure 儲存體帳戶 (一般用途 v1) Azure 事件中樞
Azure 儲存體帳戶 (一般用途)
SQL Server 2019 或 Azure SQL Database
本機開發和模擬選項 Azurite v3.12+ (跨平台) 支援工作中樞的記憶體內模擬 (詳細資訊) SQL Server Developer Edition (支援 WindowsLinuxDocker 容器)
工作中樞設定 顯式 顯式 預設為隱含 (詳細資訊)
輸送量上限 中等 非常高 中等
協調流程/實體擴增上限 (節點數) 16 32 N/A
活動擴增上限 (節點數) N/A 32 N/A
KEDA 2.0 調整支援
(詳細資訊)
❌ 未支援 ❌ 未支援 ✅ 支援使用 MSSQL scaler (詳細資訊)
支援延伸模組套件組合 (建議用於非 .NET 應用程式) ✅ 完全支援 ✅ 完全支援 ✅ 完全支援
可設定性價比? ❌ 否 ✅ 是 (事件中樞 TU 和 CU) ✅ 是 (SQL vCPU)
中斷連線的環境支援 ❌ 需要 Azure 連線能力 ❌ 需要 Azure 連線能力 ✅ 完全支援
身分識別型連線 ✅ 完全支援 ❌ 未支援 ⚠需要執行階段驅動的縮放

下一步