Hantera stora meddelanden i arbetsflöden med segmentering i Azure Logic Apps

Gäller för: Azure Logic Apps (förbrukning)

Azure Logic Apps har olika maxgränser för meddelandeinnehållsstorleken som utlöses och åtgärder kan hantera i logikappens arbetsflöden, baserat på logikappens resurstyp och miljön där logikappens arbetsflöde körs. Dessa gränser minskar eventuella kostnader som uppstår vid lagring och bearbetning av stora meddelanden. Mer information om begränsningar för meddelandestorlek finns i Meddelandegränser i Azure Logic Apps.

Om du använder inbyggda HTTP-åtgärder eller specifika åtgärder för hanterad anslutningsapp, och du behöver Azure Logic Apps för att arbeta med meddelanden som är större än standardgränserna, kan du aktivera segmentering, som delar upp ett stort meddelande i mindre meddelanden. På så sätt kan du fortfarande överföra stora filer under specifika förhållanden. När du använder dessa inbyggda HTTP-åtgärder eller specifika åtgärder för hanterade anslutningsappar är segmentering det enda sättet att använda stora meddelanden i Azure Logic Apps. Det här kravet innebär att antingen måste det underliggande HTTP-meddelandeutbytet mellan Azure Logic Apps och andra tjänster använda segmentering, eller att de anslutningar som skapats av de hanterade anslutningsappar som du vill använda också måste ha stöd för segmentering.

Anteckning

Azure Logic Apps stöder inte segmentering av utlösare på grund av den ökade kostnaden för att utbyta flera meddelanden. Dessutom implementerar Azure Logic Apps segmentering för HTTP-åtgärder med hjälp av ett eget protokoll enligt beskrivningen i den här artikeln. Så även om din webbplats eller webbtjänst stöder segmentering fungerar de inte med HTTP-åtgärdssegmentering. Om du vill använda HTTP-åtgärdssegmentering med din webbplats eller webbtjänst måste du implementera samma protokoll som används av Azure Logic Apps. Annars ska du inte aktivera segmentering av HTTP-åtgärden.

Den här artikeln innehåller en översikt över hur segmentering fungerar i Azure Logic Apps och hur du konfigurerar segmentering för åtgärder som stöds.

Vad gör meddelanden "stora"?

Meddelanden är "stora" baserat på tjänsten som hanterar dessa meddelanden. Den exakta storleksgränsen för stora meddelanden skiljer sig mellan Logic Apps och anslutningsappar. Både Logic Apps och anslutningsappar kan inte direkt använda stora meddelanden, som måste segmenteras. Information om storleksgränsen för Logic Apps-meddelanden finns i Begränsningar och konfiguration för Logic Apps. För varje anslutningsapps meddelandestorleksgräns, se anslutningsappens referensdokumentation.

Segmenterad meddelandehantering för Logic Apps

Logic Apps kan inte direkt använda utdata från segmenterade meddelanden som är större än storleksgränsen för meddelanden. Endast åtgärder som stöder segmentering kan komma åt meddelandeinnehållet i dessa utdata. En åtgärd som hanterar stora meddelanden måste därför uppfylla något av följande kriterier:

  • Inbyggt stöd för segmentering när åtgärden tillhör en anslutningsapp.
  • Ha stöd för segmentering aktiverat i den åtgärdens körningskonfiguration.

Annars får du ett körningsfel när du försöker komma åt stora innehållsutdata. Information om hur du aktiverar segmentering finns i Konfigurera stöd för segmentering.

Segmenterad meddelandehantering för anslutningsappar

Tjänster som kommunicerar med Logic Apps kan ha sina egna storleksgränser för meddelanden. Dessa gränser är ofta mindre än logic apps-gränsen. Om du till exempel antar att en anslutningsapp stöder segmentering kan en anslutningsapp betrakta ett 30 MB-meddelande som stort, medan Logic Apps inte gör det. För att uppfylla den här anslutningsappens gräns delar Logic Apps upp alla meddelanden som är större än 30 MB i mindre segment.

För anslutningsappar som stöder segmentering är det underliggande segmenteringsprotokollet osynligt för slutanvändarna. Alla anslutningsappar stöder dock inte segmentering, så dessa anslutningsappar genererar körningsfel när inkommande meddelanden överskrider anslutningsprogrammens storleksgränser.

För åtgärder som stöder och är aktiverade för segmentering kan du inte använda utlösarkroppar, variabler och uttryck, till exempel @triggerBody()?['Content'] eftersom användningen av någon av dessa indata förhindrar segmenteringsåtgärden. Använd i stället åtgärden Skriv. Mer specifikt måste du skapa ett body fält med hjälp av åtgärden Skriv för att lagra datautdata från utlösartexten, variabeln, uttrycket och så vidare, till exempel:

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

Använd sedan för att referera till data i segmenteringsåtgärden @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"
},

Konfigurera segmentering över HTTP

I allmänna HTTP-scenarier kan du dela upp nedladdningar och uppladdningar av stort innehåll via HTTP, så att logikappen och en slutpunkt kan utbyta stora meddelanden. Du måste dock dela upp meddelanden på det sätt som Logic Apps förväntar sig.

Om en slutpunkt har aktiverat segmentering för nedladdningar eller uppladdningar segmenterar HTTP-åtgärderna i logikappen automatiskt stora meddelanden. Annars måste du konfigurera stöd för segmentering på slutpunkten. Om du inte äger eller kontrollerar slutpunkten eller anslutningsappen kanske du inte har möjlighet att konfigurera segmentering.

Om en HTTP-åtgärd inte redan aktiverar segmentering måste du också konfigurera segmentering i åtgärdens runTimeConfiguration egenskap. Du kan ange den här egenskapen i åtgärden, antingen direkt i kodvyredigeraren enligt beskrivningen senare, eller i Logic Apps Designer enligt beskrivningen här:

  1. I HTTP-åtgärdens övre högra hörn väljer du ellipsknappen (...) och väljer sedan Inställningar.

    Öppna inställningsmenyn i åtgärden

  2. Under Innehållsöverföring anger du Tillåt segmentering till .

    Aktivera segmentering

  3. Fortsätt med följande avsnitt om du vill fortsätta konfigurera segmentering för nedladdningar eller uppladdningar.

Ladda ned innehåll i segment

Många slutpunkter skickar automatiskt stora meddelanden i segment när de laddas ned via en HTTP GET-begäran. Om du vill ladda ned segmenterade meddelanden från en slutpunkt via HTTP måste slutpunkten ha stöd för partiella innehållsbegäranden eller segmentnedladdningar. När logikappen skickar en HTTP GET-begäran till en slutpunkt för nedladdning av innehåll och slutpunkten svarar med statuskoden "206" innehåller svaret segmenterat innehåll. Logic Apps kan inte styra om en slutpunkt stöder partiella begäranden. Men när logikappen får det första svaret "206" skickar logikappen automatiskt flera begäranden för att ladda ned allt innehåll.

Om du vill kontrollera om en slutpunkt kan stödja partiellt innehåll skickar du en HEAD-begäran. Den här begäran hjälper dig att avgöra om svaret innehåller Accept-Ranges huvudet. Om slutpunkten stöder segmenterade nedladdningar men inte skickar segmenterat innehåll kan du föreslå det här alternativet genom att ange Range rubriken i DIN HTTP GET-begäran.

De här stegen beskriver den detaljerade process som Logic Apps använder för att ladda ned segmenterat innehåll från en slutpunkt till logikappen:

  1. Logikappen skickar en HTTP GET-begäran till slutpunkten.

    Begärandehuvudet kan också innehålla ett Range fält som beskriver ett byteintervall för att begära innehållssegment.

  2. Slutpunkten svarar med statuskoden "206" och en HTTP-meddelandetext.

    Information om innehållet i det här segmentet visas i svarets Content-Range huvud, inklusive information som hjälper Logic Apps att fastställa början och slutet för segmentet, plus den totala storleken på hela innehållet före segmenteringen.

  3. Logikappen skickar automatiskt uppföljande HTTP GET-begäranden.

    Logikappen skickar uppföljande GET-begäranden tills hela innehållet hämtas.

Den här åtgärdsdefinitionen visar till exempel en HTTP GET-begäran som anger Range huvudet. Rubriken föreslår att slutpunkten ska svara med segmenterat innehåll:

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

GET-begäran anger "Range"-huvudet till "bytes=0-1023", vilket är byteintervallet. Om slutpunkten stöder begäranden om partiellt innehåll svarar slutpunkten med ett innehållssegment från det begärda intervallet. Baserat på slutpunkten kan det exakta formatet för rubrikfältet "Intervall" skilja sig åt.

Ladda upp innehåll i segment

Om du vill ladda upp segmenterat innehåll från en HTTP-åtgärd måste åtgärden ha aktiverat stöd för segmentering via åtgärdens runtimeConfiguration egenskap. Med den här inställningen kan åtgärden starta segmenteringsprotokollet. Logikappen kan sedan skicka ett första POST- eller PUT-meddelande till målslutpunkten. När slutpunkten svarar med en föreslagen segmentstorlek följer logikappen upp genom att skicka HTTP PATCH-begäranden som innehåller innehållssegmenten.

Följande steg beskriver den detaljerade process som Logic Apps använder för att ladda upp segmenterat innehåll från logikappen till en slutpunkt:

  1. Logikappen skickar en första HTTP POST- eller PUT-begäran med ett tomt meddelandetext. Begärandehuvudet innehåller följande information om innehållet som logikappen vill ladda upp i segment:

    Fältet För logic apps-begärandehuvud Värde Typ Description
    x-ms-transfer-mode Chunked Sträng Anger att innehållet laddas upp i segment
    x-ms-content-length <innehållslängd> Integer Hela innehållsstorleken i byte före segmentering
  2. Slutpunkten svarar med statuskoden "200" och följande information:

    Fält för slutpunktssvarshuvud Typ Obligatorisk Beskrivning
    Plats Sträng Ja DEN URL-plats där HTTP PATCH-meddelanden ska skickas
    x-ms-chunk-size Integer Nej Den föreslagna segmentstorleken i byte
  3. Logikappen skapar och skickar uppföljande HTTP PATCH-meddelanden – var och en med följande information:

    • Ett innehållssegment baserat på x-ms-segmentstorlek eller viss internt beräknad storlek tills allt innehåll som summerar x-ms-content-length laddas upp sekventiellt

    • Följande rubrikinformation om innehållssegmentet som skickas i varje PATCH-meddelande:

      Fältet För logic apps-begärandehuvud Värde Typ Description
      Innehållsintervall <Utbud> Sträng Byteintervallet för det aktuella innehållssegmentet, inklusive startvärdet, slutvärdet och den totala innehållsstorleken, till exempel: "bytes=0-1023/10100"
      Innehållstyp <innehållstyp> Sträng Typ av segmenterat innehåll
      Innehållslängd <innehållslängd> Sträng Längden på storleken i byte för det aktuella segmentet
  4. Efter varje PATCH-begäran bekräftar slutpunkten kvittot för varje segment genom att svara med statuskoden "200" och följande svarsrubriker:

    Fält för slutpunktssvarshuvud Typ Obligatorisk Beskrivning
    Intervall Sträng Ja Byteintervallet för innehåll som har tagits emot av slutpunkten, till exempel: "bytes=0-1023"
    x-ms-chunk-size Integer Nej Den föreslagna segmentstorleken i byte

Den här åtgärdsdefinitionen visar till exempel en HTTP POST-begäran om att ladda upp segmenterat innehåll till en slutpunkt. I åtgärdens runTimeConfiguration egenskap contentTransfer anger transferMode egenskapen :chunked

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