從 Azure Logic Apps 中的工作流程連線到 Azure 服務匯流排
適用於:Azure Logic Apps (使用量 + 標準)
本指南說明如何使用服務匯流排連接器,從 Azure Logic Apps 中的工作流程存取 Azure 服務匯流排。 接下來,您可以建立自動化工作流程,這些工作流程會在服務匯流排中的事件觸發時執行,或執行動作來管理服務匯流排項目,例如:
- 監視訊息何時在佇列、主題及主題訂用帳戶中送達 (自動完成) 或接收 (查看鎖定)。
- 傳送訊息。
- 建立和刪除主題訂用帳戶。
- 管理佇列和主題訂用帳戶中的訊息,例如,取得、延後、完成、延遲、放棄和無效信件。
- 更新佇列和主題訂用帳戶中訊息和工作階段的鎖定。
- 關閉佇列和主題中的工作階段。
您可以使用觸發程序,從 Azure 服務匯流排收到回應,並且讓輸出可供工作流程中的其他動作使用。 您也可以讓其他動作使用服務匯流排動作的輸出。
連接器技術參考
根據邏輯應用程式工作流程類型和主機環境,服務匯流排連接器會有不同的版本。
邏輯應用程式 | Environment | 連接器版本 |
---|---|---|
耗用 | 多租用戶 Azure Logic Apps | 受控連接器,其顯示在連接器資源庫的 [執行階段]>[共用] 下。 注意:服務匯流排受控連接器觸發程序會遵循長輪詢觸發程序模式,這表示觸發程序會定期檢查佇列或主題訂閱中的訊息。 如需詳細資訊,請參閱下列文件: - 服務匯流排受控連接器參考 - Azure Logic Apps 的受控連接器 |
標準 | 單一租用戶 Azure Logic Apps 和 App Service 環境 v3 (僅限 Windows 方案) | 顯示在連接器資源庫的 [執行階段] > [共用] 下的受控連接器 (Azure 裝載),以及顯示在連接器資源庫的 [執行階段] > [應用程式內] 下並以服務提供者為基礎的內建連接器。 服務匯流排受控連接器觸發程序會遵循長輪詢觸發程序模式,這表示觸發程序會定期檢查佇列或主題訂閱中的訊息。 服務匯流排 內建連接器非會話觸發程式遵循由連接器完全管理的連續輪詢觸發程式模式。 此模式具有觸發程式會持續檢查佇列或主題訂用帳戶中的訊息。 會話觸發程式會遵循 長時間輪詢觸發程式模式,但其設定是由名為 clientRetryOptions:tryTimeout 的 Azure Functions 設定所控管。 內建版本通常可提供更佳的效能、功能、定價等等。 |
如需詳細資訊,請參閱下列文件: - 服務匯流排受控連接器參考 - 服務匯流排內建連接器作業 - Azure Logic Apps 中的內建連接器 |
必要條件
Azure 帳戶和訂用帳戶。 如果您沒有 Azure 訂用帳戶,請先註冊免費的 Azure 帳戶。
服務匯流排命名空間和傳訊實體,例如佇列。 如需詳細資訊,請參閱下列文件:
連線到服務匯流排命名空間和傳訊實體的邏輯應用程式工作流程。 若要使用服務匯流排觸發程序啟動工作流程,必須從空白工作流程開始。 若要在工作流程中使用服務匯流排動作,請使用任何觸發程序啟動您的工作流程。
如果您的邏輯應用程式資源是使用受控識別來驗證服務匯流排命名空間和傳訊實體的存取權,請確定您已在對應的層級指派角色權限。 例如,若要存取佇列,受控識別需要具有該佇列所需權限的角色。
每個邏輯應用程式資源都應該只使用一個受控識別,即使邏輯應用程式的工作流程存取不同的傳訊實體也是如此。
存取佇列或主題訂閱的每個受控識別都應使用自己的服務匯流排 API 連線。
與不同傳訊實體交換訊息並需要不同權限的服務匯流排作業應使用自己的服務匯流排 API 連線。
如需關於受控識別的詳細資訊,請參閱在 Azure Logic Apps 中使用受控識別驗證對 Azure 資源的存取權。
服務匯流排連接器作業預設為無狀態。 若要以具狀態模式執行這些作業,請參閱為無狀態內建連接器啟用具狀態模式。
Azure 服務匯流排作業的考量
無限迴圈
重要
當您同時選取具有相同連接器類型的觸發程序和動作,並使用它們來處理相同實體時,例如傳訊佇列或主題訂閱時,請多加注意。 此組合會建立無限迴圈,這會導致永遠不會結束的邏輯應用程式。
連接器快取中已儲存工作階段的限制
依據服務匯流排傳訊實體,例如訂用帳戶或主題,服務匯流排連接器一次最多可以節省 1,500 個唯一工作階段到連接器快取。 如果工作階段計數超過此限制,則會從快取中移除舊的工作階段。 如需詳細資訊,請參閱訊息工作階段。
依序傳送相互關聯的訊息
當您需要以特定順序傳送相關訊息時,可以使用服務匯流排連接器和循序群組模式來建立工作流程。 相互關聯的訊息具有屬性,可定義這些訊息之間的關聯性,例如 Azure 服務匯流排中的工作階段識別碼。
當您建立使用量邏輯應用程式工作流程時,可以使用服務匯流排工作階段範本來選取相互關聯的依序傳遞,以實作循序群組模式。 如需詳細資訊,請參閱依序傳送相互關聯的訊息。
大型訊息支援
當您使用服務匯流排內建連接器作業時,大型訊息支援僅適用於標準工作流程。 例如,您可以分別使用內建觸發程序和動作來接收大型訊息。
針對服務匯流排受控連接器,訊息大小上限限制為 1 MB,即使您使用進階層服務匯流排命名空間也一樣。
增加接收及傳送訊息的逾時
在使用服務匯流排內建作業的標準工作流程中,您可以增加接收及傳送訊息的逾時。 例如,若要增加接收訊息的逾時,請在 Azure Functions 擴充功能中變更下列設定:
{
"version": "2.0",
"extensionBundle": {
"id": "Microsoft.Azure.Functions.ExtensionBundle.Workflows",
"version": "[1.*, 2.0.0)"
},
"extensions": {
"serviceBus": {
"batchOptions": {
"operationTimeout": "00:15:00"
}
}
}
}
若要增加傳送訊息的逾時時間,請新增 ServiceProviders.ServiceBus.MessageSenderOperationTimeout 應用程式設定。
服務匯流排受控連接器觸發程序
對於服務匯流排受控連接器,所有觸發程序都是長輪詢。 此觸發程序類型會處理所有訊息,然後等候 30 秒讓佇列或主題訂用帳戶中出現更多訊息。 如果在 30 秒內未出現任何訊息,就會略過觸發程序執行。 如果有,觸發程序會繼續讀取訊息,直到佇列或主題訂閱是空的。 下一次的觸發程序輪詢,會根據觸發程序的屬性指定的循環間隔。
部分觸發程序 (像是 [一或多個訊息到達佇列時 (自動完成)] 觸發程序) 會傳回一或多個訊息。 引發這些觸發程序時,其傳回的訊息數會介於 1 與此觸發程序訊息計數上限屬性指定的訊息數目之間。
注意
自動完成觸發程序會自動完成訊息,但僅在下一次呼叫服務匯流排時才會發生完成。 此行為可能會影響您的工作流程設計。 例如,避免在自動完成觸發程序上變更並行,因為如果您的工作流程進入節流狀態,這項變更就可能會導致重複的訊息。 變更並行控制項會建立下列條件:
使用
WorkflowRunInProgress
程式碼可略過節流觸發程序。完成作業將不會執行。
下一個觸發程序執行則會在輪詢間隔之後發生。
您必須將服務匯流排鎖定持續時間的值設定為超過輪詢間隔。 不過,儘管如此設定,如果您的工作流程在下一個輪詢間隔維持節流狀態,訊息仍可能無法完成。
不過,如果您開啟服務匯流排觸發程序的並行設定,
maximumWaitingRuns
屬性的預設值為 10。 根據服務匯流排實體的鎖定持續時間設定以及您工作流程的執行持續時間,此預設值可能會太大,並且可能會導致「鎖定遺失」例外狀況。 若要尋找您案例的最佳值,請針對maximumWaitingRuns
屬性使用 1 或 2 的值開始進行測試。 若要變更最大等候執行數的值,請檢閱變更等候執行數限制。
服務匯流排內建連接器觸發程序
對於他 服務匯流排 內建連接器,非會話觸發程式會遵循由連接器完全管理的連續輪詢觸發程式模式。 此模式具有觸發程式會持續檢查佇列或主題訂用帳戶中的訊息。 會話觸發程式遵循 長時間輪詢觸發程式模式,其設定是由名為 clientRetryOptions:tryTimeout 的 Azure Functions 設定所控管。 目前,服務匯流排內建觸發程序的組態設定會在 Azure Functions 主機延伸模組 (在您的邏輯應用程式的 host.json 檔案中定義) 與您的邏輯應用程式的工作流程中定義的觸發程序設定 (您可以透過設計工具或程式碼檢視進行設定) 之間共用。 本節涵蓋這兩個設定位置。
在標準工作流程中,某些觸發程序 (例如「當訊息在佇列中可用時」觸發程序) 可以傳回一則或多則訊息。 當這些觸發程序引發時,它們會傳回一則到多則訊息。 對於此類型的觸發程序,若不支援 Maximum message count 參數,您仍然可以使用 host.json 檔案中的 maxMessageBatchSize 屬性來控制接收的訊息數。 若要找到此檔案,請參閱編輯標準邏輯應用程式的主機和應用程式設定。
"extensions": { "serviceBus": { "maxMessageBatchSize": 25 } }
您也可以透過設計工具或在程式碼中啟用服務匯流排觸發程序上的並行功能:
"runtimeConfiguration": { "concurrency": { "runs": 100 } }
當您使用批次設定並行功能時,請保持並行執行數大於整體批次大小。 這樣,已讀取的訊息就不會進入等待狀態,而且在讀取它們時一律會加以處理。 在某些情況下,觸發程序的批次大小最多可達兩倍。
如果啟用並行功能,SplitOn 限制會減少到 100 個項目。 此行為適用於所有觸發程序,而不只是服務匯流排觸發程序。 確保在啟用並行功能的任何觸發程序上指定的批次大小小於此限制。
在某些情況下,觸發程序可能會超出並行設定。 Azure Logic Apps 不會讓這些執行失敗,而會將它們置於等待狀態的佇列中,直到它們可以啟動為止。 maximumWaitingRuns 設定可控制等待狀態下允許的執行次數:
"runtimeConfiguration": { "concurrency": { "runs": 100, "maximumWaitingRuns": 50 } }
使用服務匯流排觸發程序時,請確保仔細測試這些變更,以便執行等待的時間不會超過訊息鎖定逾時的時間。 如需預設值的詳細資訊,請參閱此處的並行和取消批處理限制。
如果您啟用並行功能,則依預設批次讀取之間會存在 30 秒的延遲。 此延遲會減慢觸發程序的速度,以達成以下目標:
減少傳送以檢查套用並行處理的執行次數的儲存體呼叫次數。
模仿服務匯流排受控連接器觸發程序的行為,未找到訊息時,該觸發程序會進行 30 秒的長輪詢。
您可以變更此延遲,但請確保仔細測試對預設值的任何變更:
"workflow": { "settings": { "Runtime.ServiceProviders.FunctionTriggers.DynamicListenerEnableDisableInterval": "00:00:30" } }
步驟 1:檢查服務匯流排命名空間的存取
若要確認邏輯應用程式資源具有存取服務匯流排命名空間的權限,請使用下列步驟:
在 Azure 入口網站中,開啟您的服務匯流排命名空間。
在命名空間選單的 [設定] 下方,選取 [共用存取原則]。 在 [宣告] 之下,確認您有該命名空間的 [管理] 權限。
步驟 2:取得連線驗證需求
稍後,當您第一次新增服務匯流排觸發程序或動作時,系統會提示您輸入連線資訊,包括連線驗證類型。 根據您的邏輯應用程式工作流程類型、服務匯流排連接器版本以及選取的驗證類型,您將需要下列項目:
受控連接器驗證 (使用量和標準工作流程)
驗證類型 | 必要資訊 |
---|---|
存取金鑰 | 服務匯流排命名空間的連接字串。 如需詳細資訊,請參閱取得服務匯流排命名空間的連接字串 |
Microsoft Entra 整合 | 服務匯流排命名空間的端點 URL。 如需詳細資訊,請參閱取得服務匯流排命名空間的端點 URL。 |
Logic Apps 受控識別 | 服務匯流排命名空間的端點 URL。 如需詳細資訊,請參閱取得服務匯流排命名空間的端點 URL。 |
內建連接器驗證 (僅標準工作流程)
驗證類型 | 必要資訊 |
---|---|
連接字串 | 服務匯流排命名空間的連接字串。 如需詳細資訊,請參閱取得服務匯流排命名空間的連接字串 |
Active Directory OAuth | - 服務匯流排命名空間的完整名稱,例如 <your-Service-Bus-namespace>.servicebus.windows.net。 如需詳細資訊,請檢閱取得服務匯流排命名空間的完整名稱。 如需其他屬性值,請參閱使用 Microsoft Entra ID 的 OAuth。 |
受控識別 | 服務匯流排命名空間的完整名稱,例如 <your-Service-Bus-namespace>.servicebus.windows.net。 如需詳細資訊,請檢閱取得服務匯流排命名空間的完整名稱。 |
取得服務匯流排命名空間的連接字串
若要在新增服務匯流排觸發程序或動作時建立連線,您需要有服務匯流排命名空間的連接字串。 連接字串開頭為 sb:// 前置詞。
在 Azure 入口網站中,開啟您的服務匯流排命名空間。
在命名空間選單的 [設定] 下方,選取 [共用存取原則]。
在 [共用存取原則] 窗格上,選取 [RootManageSharedAccessKey]。
選取主要或次要連接字串旁邊的 [複製] 按鈕。
注意
若要檢查是否為命名空間而非特定傳訊實體的字串,請搜尋
EntityPath
參數的連接字串。 如果您發現這個參數,表示此連接字串適用於特定實體,但不是可用於您工作流程的正確字串。儲存連接字串以供稍後使用。
取得服務匯流排命名空間的端點 URL
如果您使用服務匯流排受控連接器,選取 [Microsoft Entra 整合] 或 [Logic Apps 受控識別] 驗證類型時,會需要此端點 URL。 端點 URL 開頭為 sb:// 前置詞。
在 Azure 入口網站中,開啟您的服務匯流排命名空間。
在命名空間功能表的 [設定] 下方,選取 [屬性]。
在 [屬性] 下,於 [服務匯流排端點] 旁邊,複製端點 URL,並儲存以供稍後當您必須提供服務匯流排端點 URL 時使用。
取得服務匯流排命名空間的完整名稱
在 Azure 入口網站中,開啟您的服務匯流排命名空間。
在命名空間功能表上,選取 [概觀]。
在 [概觀] 窗格中,尋找 [主機名稱] 屬性,並複製完整名稱,看起來像 <your-Service-Bus-namespace>.servicebus.windows.net。
步驟 3:選項 1 - 新增服務匯流排觸發程序
下列步驟會使用 Azure 入口網站進行,但若搭配適當的 Azure Logic Apps 擴充功能,則也可以使用下列工具來建立邏輯應用程式工作流程:
使用量邏輯應用程式工作流程:Visual Studio 或 Visual Studio Code
標準邏輯應用程式工作流程:Visual Studio Code
在 Azure 入口網站中,於設計工具中開啟您的使用量邏輯應用程式資源和空白工作流程。
在設計工具中,遵循這些一般步驟來新增您想要的 Azure 服務匯流排觸發程序。
此範例會繼續進行名為 [佇列中收到訊息時 (自動完成)] 的觸發程序。
如果出現提示,請針對您的連線提供下列資訊。 完成時,選取建立。
屬性 必要 描述 連線名稱 Yes 您連線的名稱 驗證類型 Yes 用來存取您服務匯流排命名空間的驗證類型。 如需詳細資訊,請檢閱受控連接器驗證。 連接字串 Yes 您先前複製並儲存的連接字串。 例如,此連線會使用存取金鑰驗證,並提供服務匯流排命名空間的連接字串:
出現觸發程序資訊方塊之後,請提供必要的資訊,例如:
屬性 必要 描述 佇列名稱 Yes 要存取的已選取佇列 佇列類型 No 所選佇列的類型 多久要檢查一次項目? Yes 檢查佇列中項目的輪詢間隔和頻率 若要將任何其他可用的屬性新增至觸發程序,請開啟 [新增參數] 清單,並選取您想要的屬性。
新增您工作流程所需的任何動作。
例如,您可以新增在新訊息送達時,會傳送電子郵件的動作。 當觸發程序檢查您的佇列並且發現新訊息時,您的工作流程會針對所找到的訊息來執行已選取的動作。
完成後,請儲存您的工作流程。 在設計師工具列上選取儲存。
步驟 3:選項 2 - 新增服務匯流排動作
下列步驟會使用 Azure 入口網站進行,但若搭配適當的 Azure Logic Apps 擴充功能,則也可以使用下列工具來建立邏輯應用程式工作流程:
使用量邏輯應用程式工作流程:Visual Studio 或 Visual Studio Code
標準邏輯應用程式工作流程:Visual Studio Code
在 Azure 入口網站中,於設計工具中開啟您的使用量邏輯應用程式和工作流程。
在設計工具中,遵循這些一般步驟來新增您想要的 Azure 服務匯流排動作。
此範例會繼續執行 [傳送訊息] 動作。
如果出現提示,請針對您的連線提供下列資訊。 完成時,選取建立。
屬性 必要 描述 連線名稱 Yes 您連線的名稱 驗證類型 Yes 用來存取您服務匯流排命名空間的驗證類型。 如需詳細資訊,請檢閱受控連接器驗證。 連接字串 Yes 您先前複製並儲存的連接字串。 例如,此連線會使用存取金鑰驗證,並提供服務匯流排命名空間的連接字串:
出現動作資訊方塊之後,請提供必要的資訊,例如:
屬性 必要 描述 佇列/主題名稱 Yes 傳送訊息的選取佇列或主題目的地 工作階段識別碼 No 將訊息傳送至工作階段感知佇列或主題時的工作階段識別碼 系統屬性 No - None
- 執行詳細資料:在訊息中新增有關執行身分自訂屬性的中繼資料屬性資訊。若要將任何其他可用的屬性新增至動作,請開啟 [新增參數] 清單,並選取您想要的屬性。
新增您工作流程所需的任何其他動作。
例如,您可以新增動作,該動作會傳送電子郵件來確認訊息已傳送。
完成後,請儲存您的工作流程。 在設計師工具列上選取儲存。
服務匯流排內建連接器應用程式設定
在標準邏輯應用程式資源中,服務匯流排內建連接器包含可控制各種閾值 (例如傳送訊息的逾時,以及訊息集區中每個處理器核心的訊息傳送者數目) 的應用程式設定。 如需詳細資訊,請檢閱檢閱應用程式設定的參考 - local.settings.json。
使用服務匯流排內建觸發程序從無效信件佇列讀取訊息
在標準工作流程中,若要從佇列或主題訂用帳戶中的無效信件佇列讀取訊息,請使用指定的觸發程序遵循下列步驟:
在您的空白工作流程中,根據您的案例,新增名為當佇列中有訊息可用或當主題訂用帳戶 (瞄核鎖定) 中有訊息可用的服務匯流排內建連接器觸發程序。
在觸發程序中,設定下列參數值來指定佇列或主題訂用帳戶的預設無效信件佇列,您可以像任何其他佇列一般存取:
當佇列中有訊息可用觸發程序:將佇列名稱參數設定為 queuename/$deadletterqueue。
當主題訂用帳戶 (瞄核鎖定) 中有訊息可用觸發程序:將主題名稱參數設定為 topicname/Subscriptions/subscriptionname/$deadletterqueue。
如需詳細資訊,請參閱服務匯流排無效信件佇列的概觀。
疑難排解
工作流程更新生效延遲
如果服務匯流排觸發程序的輪詢間隔很小,例如 10 秒,則工作流程的更新可能最多 10 分鐘不會生效。 若要解決此問題,您可以停用邏輯應用程式資源、進行變更,然後再次啟用邏輯應用程式資源。
沒有可用的工作階段,或可能被另一個接收者鎖定
有時候,完成訊息或更新工作階段等作業會產生下列錯誤:
{
"status": 400,
"error": {
"message": "No session available to complete the message with the lock token 'ce440818-f26f-4a04-aca8-555555555555'."
}
}
有時候,工作階段型觸發程序可能會失敗,並出現下列錯誤:
{
"status": 400,
"error": {
"message": "Communication with the Service Bus namespace 'xxxx' and 'yyyy' entity failed. The requested session 'zzzz' cannot be accepted. It may be locked by another receiver."
}
}
服務匯流排連接器會使用記憶體內部快取來支援與工作階段相關聯的所有作業。 服務匯流排訊息接收者會在接收訊息的角色執行個體記憶體中進行快取 (虛擬機器)。 若要處理所有要求,連線的所有呼叫都會路由傳送至這個相同的角色執行個體。 這是必要的行為,因為工作階段中的所有服務匯流排作業都需要接收特定工作階段訊息的相同接收者。
由於基礎結構更新、連接器部署等原因,要求可能無法路由傳送至相同的角色執行個體。 如果發生此事件,要求會因為下列其中一個原因而失敗:
無法在提供要求的角色執行個體中使用執行工作階段中作業的接收者。
新的角色執行個體會嘗試取得工作階段,但在舊角色執行個體中逾時或未關閉。
只要偶爾發生此錯誤,就預期會發生錯誤。 發生錯誤時,訊息仍會保留在服務匯流排中。 下一個觸發程序或工作流程執行會嘗試再次處理訊息。