在 Azure Logic Apps 中利用區塊化在工作流程中處理大型訊息

適用於:Azure Logic Apps (使用量)

Azure Logic Apps 根據邏輯應用程式資源類型和邏輯應用程式工作流程執行所在的環境,對觸發程序和動作在邏輯應用程式工作流程中可以處理的訊息內容大小有不同的上限。 這些限制有助於降低儲存和處理大型訊息所產生的任何額外負荷。 如需訊息大小限制的詳細資訊,請檢閱 Azure Logic Apps中的訊息限制

如果您使用內建 HTTP 動作或特定的受控連接器動作,而且您需要 Azure Logic Apps 來處理大於預設限制的訊息,您可以啟用區塊化,這會將大型訊息分割成較小的訊息。 透過這種方式,您仍可在特定情況下傳輸大型檔案。 事實上,當您使用這些內建 HTTP 動作或特定的受控連接器動作時,區塊化是 Azure Logic Apps 取用大型訊息的唯一方式。 此需求表示 Azure Logic Apps 和其他服務之間的基礎 HTTP 訊息交換必須使用區塊化,或是您想要使用的受控連接器所建立的連線也必須支援區塊化。

注意

交換多個訊息會增加額外負荷,因此 Azure Logic Apps 不支援觸發程序的區塊化。 此外,Azure Logic Apps 會如本文所述,使用自己的通訊協定來實作 HTTP 動作的區塊化。 因此,即使網站或 Web 服務支援區塊化,其也無法使用 HTTP 動作區塊化。 若要搭配您的網站或 Web 服務使用 HTTP 動作區塊化,您必須實作 Azure Logic Apps 所使用的相同通訊協定。 否則,請勿在 HTTP 動作上啟用區塊化。

本文提供區塊化如何在 Azure Logic Apps 中運作的概觀,以及如何在支援的動作上設定區塊化。

要如何判定訊息「過大」?

訊息是否「過大」須以處理這些訊息的服務為基準。 因此 Logic Apps 和連接器對大型訊息的實際大小限制會有所不同。 當 Logic Apps 和連接器都無法直接消化大型訊息時,就必須加以分塊。 針對 Logic Apps 的訊息大小限制,請參閱 Logic Apps limits and configuration (Logic Apps 限制與設定)。 如需每個連接器的訊息大小限制,請參閱連接器的參考文件

Logic Apps 的分塊訊息處理

Logic Apps 無法直接使用超過訊息大小上限的分塊訊息輸出。 只有支援區塊化的動作能夠存取這些輸出中的訊息內容。 因此,處理大型訊息的動作須符合以下任一準則:

  • 當該動作屬於連接器時,原本就支援區塊化。
  • 已在該動作的執行階段設定中啟用了區塊化支援。

若未符合任一準則,您就會在嘗試存取大型內容輸出時得到執行階段錯誤。 若要啟用區塊化,請參閱 Set up chunking support (設定區塊化支援)。

連接器的分塊訊息處理

與 Logic Apps 通訊的服務可能有其本身的訊息大小限制。 這些限制通常小於 Logic Apps 的限制。 舉例來說,假設連接器支援區塊化,那麼連接器可能會認為 30 MB 的訊息過大,而 Logic Apps 則否。 為了與此連接器的限制達成一致性,Logic Apps 必須將所有大於 30 MB 的訊息分割為較小的區塊。

這些支援區塊化的連接器終端使用者,並無法查看基礎區塊化通訊協定。 而因為並非所有連接器均支援區塊化,所以這些連接器會在傳入的訊息超過連接器的大小限制時,產生執行階段錯誤。

對於支援和啟用區塊化的動作,您無法使用觸發程序主體、變數和運算式,例如 @triggerBody()?['Content'],因為使用這些輸入的任何一項可防止區塊化作業發生。 請改用 Compose 動作。 具體而言,您必須使用 bodyCompose 動作來建立 欄位,以儲存觸發程序主體、變數、運算式等的資料輸出,例如:

"Compose": {
    "inputs": {
        "body": "@variables('myVar1')"
    },
    "runAfter": {
        "Until": [
            "Succeeded"
        ]
    },
    "type": "Compose"
},

然後,若要參考資料,請在區塊化動作中使用 @body('Compose')

"Create_file": {
    "inputs": {
        "body": "@body('Compose')",
        "headers": {
            "ReadFileMetadataFromServer": true
        },
        "host": {
            "connection": {
                "name": "@parameters('$connections')['sftpwithssh_1']['connectionId']"
            }
        },
        "method": "post",
        "path": "/datasets/default/files",
        "queries": {
            "folderPath": "/c:/test1/test1sub",
            "name": "tt.txt",
            "queryParametersSingleEncoded": true
        }
    },
    "runAfter": {
        "Compose": [
            "Succeeded"
        ]
    },
    "runtimeConfiguration": {
        "contentTransfer": {
            "transferMode": "Chunked"
        }
    },
    "type": "ApiConnection"
},

在 HTTP 上設定區塊化

在一般 HTTP 案例中,您可以分割大型內容下載並透過 HTTP 上傳,使您的邏輯應用程式與端點得以交換大型訊息。 不過,您分割訊息的方式必須符合 Logic Apps 的標準。

若端點已為下載或上傳啟用了區塊化,則您邏輯應用程式中的 HTTP 動作就會自動分割大型訊息。 反之,您就得在端點上設定區塊化支援。 如果您不具有端點或連接器的擁有權或控制權,就可能沒有設定區塊化的選項。

此外,如果 HTTP 動作尚未啟用區塊化,您也必須在動作的 runTimeConfiguration 屬性中設定區塊化。 您可以直接在之後提及的程式碼檢視編輯器,或是此處所述的 Logic Apps 設計工具中,在動作內設定此屬性。

  1. 在 HTTP 動作的右上角選擇省略符號按鈕 (...),然後選擇 [設定]

    On the action, open the settings menu

  2. 在 [Content Transfer] \(內容傳輸\) 下將 [Allow chunking] \(允許區塊化\) 設定為 [On] \(開啟\)

    Turn on chunking

  3. 若要繼續為下載或上傳設定區塊化,請遵循以下各節繼續。

以區塊下載內容

許多端點在接收透過 HTTP GET 要求的下載時,會自動以區塊傳送大型訊息。 為了從端點透過 HTTP 下載區塊化訊息,端點必須支援 partial content (部分內容) 要求,或是 chunked downloads (分塊下載)。 當您的邏輯應用程式向端點傳送 HTTP GET 要求以下載內容,而端點回應 "206" 狀態碼時,回應會包含分塊的內容。 Logic Apps 無法控制端點是否支援部分要求。 不過,當您的邏輯應用程式得到第一個 "206" 回應時,會自動傳送多個要求以下載所有內容。

若要確認端點是否支援部分內容,請傳送 HEAD 要求。 此要求可協助您判斷回應是否包含 Accept-Ranges 標頭。 如此一來,就能在端點支援分塊下載但未傳送分塊內容時,在 HTTP GET 要求中設定 Range標頭來建議此選項。

以下步驟詳述了 Logic Apps 從端點將分塊內容下載至您邏輯應用程式所用的流程:

  1. 您的邏輯應用程式傳送 HTTP GET 要求至端點。

    要求標頭可包含 Range 欄位,描述要求內容區塊的位元組範圍。

  2. 端點回應 "206" 狀態碼和 HTTP 訊息本文。

    此區塊內容的詳細資料會出現在回應的 Content-Range 標頭中,包含可協助 Logic Apps 在進行區塊化前,判斷區塊頭尾與整體內容大小總計。

  3. 您的邏輯應用程式自動傳送後續 HTTP GET 要求。

    您的邏輯應用程式繼續傳送後續 GET 要求,直到擷取所有內容為止。

舉例來說,這項動作定義呈現了設定 Range 標頭的 HTTP GET 要求。 該標頭會建議端點應以分塊內容回應:

"getAction": {
    "inputs": {
        "headers": {
            "Range": "bytes=0-1023"
        },
       "method": "GET",
       "uri": "http://myAPIendpoint/api/downloadContent"
    },
    "runAfter": {},
    "type": "Http"
}

GET 要求將 "Range" 標頭設定為 "bytes=0-1023",這是位元組範圍。 若端點支援部分內容的要求,則端點會根據要求的範圍以內容區塊回應。 根據端點而定,"Range" 標頭欄位的實際格式可能會有所不同。

以區塊上傳內容

若要從 HTTP 動作上傳分塊內容,動作本身的 runtimeConfiguration 屬性中必須已啟用區塊化支援。 此設定可讓動作啟動區塊化通訊協定。 您的邏輯應用程式隨後可傳送起始 POST 或 PUT 訊息至目標端點。 在端點以建議的區塊大小回應後,您的邏輯應用程式隨後會傳送包含內容區塊的 HTTP PATCH 要求。

以下步驟詳述了 Logic Apps 從邏輯應用程式將分塊內容上傳至端點所用的流程:

  1. 您的邏輯應用程式送包含空白訊息本文的起始 HTTP POST 或 PUT 要求。 要求標頭會包含以下相關資訊,說明邏輯應用程式想要以區塊上傳的內容:

    Logic Apps 要求標頭欄位 類型 描述
    x-ms-transfer-mode chunked String 指出內容以區塊上傳
    x-ms-content-length <content-length> 整數 進行區塊化前的所有內容大小 (位元組)
  2. 端點回應「200」成功狀態碼和以下資訊:

    端點回應標頭欄位 類型 必要 描述
    地點 String Yes 傳送 HTTP PATCH 訊息的 URL 位置
    x-ms-chunk-size 整數 No 建議的區塊大小 (位元組)
  3. 邏輯應用程式建立並傳送後續 HTTP PATCH 訊息,每項訊息都帶有以下資訊:

    • 內容區塊會以 x-ms-chunk-size或其他內部計算的大小為基準,直到所有總計 x-ms-content-length 的內容均依序上傳完畢為止。

    • 以下與內容區塊相關的標題詳細資料會在各個 PATCH 訊息中傳送:

      Logic Apps 要求標頭欄位 類型 描述
      Content-Range <range> String 目前內容區塊的位元組範圍,包含開始值、結束值和內容大小總計,例如:"bytes=0-1023/10100"
      Content-Type <content-type> String 分塊內容的類型
      Content-Length <content-length> String 目前區塊的大小長度 (位元組)
  4. 端點會在收到每項 PATCH 要求之後回應 "200" 狀態碼及下列回應標頭,以確認各區塊的接收狀況:

    端點回應標頭欄位 類型 必要 描述
    範圍 String Yes 端點已接收內容的位元組範圍,例如:"bytes=0-1023"
    x-ms-chunk-size 整數 No 建議的區塊大小 (位元組)

舉例來說,這項動作定義呈現了將分塊內容傳送至端點的 HTTP POST 要求。 在動作的 runTimeConfiguration 屬性中,contentTransfer 屬性將 transferMode 設定為 chunked

"postAction": {
    "runtimeConfiguration": {
        "contentTransfer": {
            "transferMode": "chunked"
        }
    },
    "inputs": {
        "method": "POST",
        "uri": "http://myAPIendpoint/api/action",
        "body": "@body('getAction')"
    },
    "runAfter": {
    "getAction": ["Succeeded"]
    },
    "type": "Http"
}