Grote berichten in werkstromen verwerken met behulp van segmentering in Azure Logic Apps

Van toepassing op: Azure Logic Apps (verbruik)

Azure Logic Apps heeft verschillende maximumlimieten voor de grootte van berichtinhoud die triggers en acties kunnen verwerken in werkstromen voor logische apps, op basis van het resourcetype van de logische app en de omgeving waarin de werkstroom van de logische app wordt uitgevoerd. Deze limieten helpen de overhead te verminderen die het gevolg is van het opslaan en verwerken van grote berichten. Zie Berichtlimieten in Azure Logic Apps voor meer informatie over berichtgroottelimieten.

Als u ingebouwde HTTP-acties of specifieke acties voor beheerde connectors gebruikt en Azure Logic Apps moet werken met berichten die groter zijn dan de standaardlimieten, kunt u segmentering inschakelen, waardoor een groot bericht in kleinere berichten wordt gesplitst. Op die manier kunt u nog steeds grote bestanden onder specifieke omstandigheden overdragen. Als u deze ingebouwde HTTP-acties of specifieke acties voor beheerde connectors gebruikt, is segmentering de enige manier waarop Azure Logic Apps grote berichten kan gebruiken. Deze vereiste betekent dat de onderliggende HTTP-berichtuitwisseling tussen Azure Logic Apps en andere services segmentering moet gebruiken, of dat de verbindingen die zijn gemaakt door de beheerde connectors die u wilt gebruiken, ook ondersteuning moeten bieden voor segmentering.

Notitie

Azure Logic Apps biedt geen ondersteuning voor segmentering van triggers vanwege de verhoogde overhead van het uitwisselen van meerdere berichten. Azure Logic Apps implementeert ook segmentering voor HTTP-acties met behulp van een eigen protocol, zoals beschreven in dit artikel. Dus zelfs als uw website of webservice segmentering ondersteunt, werken ze niet met HTTP-actiesegmentering. Als u HTTP-actiesegmentering wilt gebruiken met uw website of webservice, moet u hetzelfde protocol implementeren dat wordt gebruikt door Azure Logic Apps. Schakel anders segmentering niet in op de HTTP-actie.

Dit artikel bevat een overzicht van de werking van segmentering in Azure Logic Apps en het instellen van segmentering voor ondersteunde acties.

Wat maakt berichten 'groot'?

Berichten zijn 'groot' op basis van de service die deze berichten verwerkt. De exacte groottelimiet voor grote berichten verschilt tussen Logic Apps en connectors. Zowel Logic Apps als connectors kunnen niet rechtstreeks grote berichten gebruiken, die moeten worden gesegmenteerd. Zie Limieten en configuratie van Logic Apps voor de berichtgroottelimiet van Logic Apps. Zie de referentiedocumentatie van de connector voor de berichtgrootte van elke connector.

Verwerking van gesegmenteerde berichten voor Logic Apps

Logic Apps kan niet rechtstreeks gebruikmaken van uitvoer van gesegmenteerde berichten die groter zijn dan de limiet voor de berichtgrootte. Alleen acties die ondersteuning bieden voor segmentering hebben toegang tot de berichtinhoud in deze uitvoer. Een actie die grote berichten verwerkt, moet dus aan deze criteria voldoen:

  • Systeemeigen ondersteuning voor segmentering wanneer die actie tot een connector behoort.
  • Zorg ervoor dat segmenteringsondersteuning is ingeschakeld in de runtimeconfiguratie van die actie.

Anders krijgt u een runtimefout wanneer u toegang probeert te krijgen tot grote inhoudsuitvoer. Zie Ondersteuning voor segmentering instellen als u segmentering wilt inschakelen.

Verwerking van gesegmenteerde berichten voor connectors

Services die communiceren met Logic Apps kunnen hun eigen limieten voor de berichtgrootte hebben. Deze limieten zijn vaak kleiner dan de limiet voor Logic Apps. Als bijvoorbeeld wordt aangenomen dat een connector segmentering ondersteunt, kan een connector een bericht van 30 MB als groot beschouwen, terwijl Logic Apps dat niet doet. Om te voldoen aan de limiet van deze connector, splitst Logic Apps elk bericht groter dan 30 MB in kleinere segmenten.

Voor connectors die ondersteuning bieden voor segmentering, is het onderliggende segmenteringsprotocol onzichtbaar voor eindgebruikers. Niet alle connectors ondersteunen echter segmentering, dus deze connectors genereren runtimefouten wanneer binnenkomende berichten de groottelimieten van de connectors overschrijden.

Voor acties die ondersteuning bieden voor en zijn ingeschakeld voor segmentering, kunt u geen triggerteksten, variabelen en expressies gebruiken, bijvoorbeeld @triggerBody()?['Content'] omdat het gebruik van een van deze invoerwaarden voorkomt dat de segmenteringsbewerking plaatsvindt. Gebruik in plaats daarvan de actie Opstellen. U moet met name een body veld maken met behulp van de actie Opstellen om de gegevensuitvoer van de triggertekst, variabele, expressie, enzovoort op te slaan, bijvoorbeeld:

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

Als u vervolgens naar de gegevens wilt verwijzen, gebruikt @body('Compose') u in de segmenteringsactie .

"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"
},

Segmentering via HTTP instellen

In algemene HTTP-scenario's kunt u grote inhoudsdownloads en -uploads splitsen via HTTP, zodat uw logische app en een eindpunt grote berichten kunnen uitwisselen. U moet berichten echter op de manier in delen die Logic Apps verwacht.

Als een eindpunt segmentering voor downloads of uploads heeft ingeschakeld, worden met de HTTP-acties in uw logische app automatisch grote berichten gesegmenterd. Anders moet u ondersteuning voor segmentering instellen op het eindpunt. Als u geen eigenaar bent van het eindpunt of de connector, hebt u mogelijk niet de mogelijkheid om segmentering in te stellen.

Als een HTTP-actie segmentering nog niet inschakelt, moet u ook segmentering instellen in de eigenschap van runTimeConfiguration de actie. U kunt deze eigenschap instellen in de actie, rechtstreeks in de codeweergave-editor, zoals later wordt beschreven, of in logic apps designer zoals hier wordt beschreven:

  1. Kies in de rechterbovenhoek van de HTTP-actie de knop met het beletselteken (...) en kies vervolgens Instellingen.

    Open in de actie het menu Instellingen

  2. Stel onder Inhoudsoverdrachtsegmenteren toestaan in op Aan.

    Segmentering inschakelen

  3. Als u wilt doorgaan met het instellen van segmentering voor downloads of uploads, gaat u verder met de volgende secties.

Inhoud in segmenten downloaden

Veel eindpunten verzenden automatisch grote berichten in segmenten wanneer ze worden gedownload via een HTTP GET-aanvraag. Als u gesegmenteerde berichten van een eindpunt via HTTP wilt downloaden, moet het eindpunt gedeeltelijke inhoudsaanvragen of gesegmenteerde downloads ondersteunen. Wanneer uw logische app een HTTP GET-aanvraag verzendt naar een eindpunt voor het downloaden van inhoud en het eindpunt reageert met een statuscode '206', bevat het antwoord gesegmenteerde inhoud. Logic Apps kan niet bepalen of een eindpunt gedeeltelijke aanvragen ondersteunt. Wanneer uw logische app echter het eerste 206-antwoord krijgt, verzendt uw logische app automatisch meerdere aanvragen om alle inhoud te downloaden.

Als u wilt controleren of een eindpunt gedeeltelijke inhoud kan ondersteunen, verzendt u een HEAD-aanvraag. Met deze aanvraag kunt u bepalen of het antwoord de Accept-Ranges header bevat. Als het eindpunt gesegmenteerde downloads ondersteunt, maar geen gesegmenteerde inhoud verzendt, kunt u deze optie voorstellen door de Range header in uw HTTP GET-aanvraag in te stellen.

In deze stappen wordt het gedetailleerde proces beschreven dat Logic Apps gebruikt voor het downloaden van gesegmenteerde inhoud van een eindpunt naar uw logische app:

  1. Uw logische app verzendt een HTTP GET-aanvraag naar het eindpunt.

    De aanvraagheader kan desgewenst een Range veld bevatten waarin een bytebereik wordt beschreven voor het aanvragen van inhoudssegmenten.

  2. Het eindpunt reageert met de statuscode 206 en de hoofdtekst van het HTTP-bericht.

    Details over de inhoud in dit segment worden weergegeven in de header van Content-Range het antwoord, inclusief informatie die Logic Apps helpt bij het bepalen van het begin en einde van het segment, plus de totale grootte van de hele inhoud voordat de segmentering wordt gesplitst.

  3. Uw logische app verzendt automatisch opvolgende HTTP GET-aanvragen.

    Uw logische app verzendt get-opvolgende aanvragen totdat de volledige inhoud is opgehaald.

In deze actiedefinitie wordt bijvoorbeeld een HTTP GET-aanvraag weergegeven waarmee de Range header wordt ingesteld. De header suggereert dat het eindpunt moet reageren met gesegmenteerde inhoud:

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

Met de GET-aanvraag wordt de header 'Bereik' ingesteld op 'bytes=0-1023', het bereik van bytes. Als het eindpunt aanvragen voor gedeeltelijke inhoud ondersteunt, reageert het eindpunt met een inhoudssegment uit het aangevraagde bereik. Op basis van het eindpunt kan de exacte indeling voor het veld 'Bereik'-header verschillen.

Inhoud in segmenten uploaden

Als u gesegmenteerde inhoud van een HTTP-actie wilt uploaden, moet de actie ondersteuning voor segmentering hebben ingeschakeld via de eigenschap van runtimeConfiguration de actie. Met deze instelling kan de actie het segmenteringsprotocol starten. Uw logische app kan vervolgens een eerste POST- of PUT-bericht verzenden naar het doeleindpunt. Nadat het eindpunt reageert met een voorgestelde segmentgrootte, volgt uw logische app op door HTTP PATCH-aanvragen te verzenden die de inhoudssegmenten bevatten.

In de volgende stappen wordt het gedetailleerde proces beschreven dat Logic Apps gebruikt voor het uploaden van gesegmenteerde inhoud van uw logische app naar een eindpunt:

  1. Uw logische app verzendt een eerste HTTP POST- of PUT-aanvraag met een lege berichttekst. De aanvraagheader bevat de volgende informatie over de inhoud die uw logische app in segmenten wil uploaden:

    Headerveld voor Logic Apps-aanvraag Waarde Type Description
    x-ms-transfer-mode gesegmenteerd Tekenreeks Geeft aan dat de inhoud in segmenten is geüpload
    x-ms-content-length <lengte van inhoud> Geheel getal De volledige inhoudsgrootte in bytes vóór het segmenteren
  2. Het eindpunt reageert met de statuscode '200' en de volgende informatie:

    Antwoordheaderveld eindpunt Type Vereist Beschrijving
    Locatie Tekenreeks Ja De URL-locatie waar de HTTP PATCH-berichten moeten worden verzonden
    x-ms-chunk-size Geheel getal No De voorgestelde segmentgrootte in bytes
  3. Uw logische app maakt en verzendt opvolgende HTTP PATCH-berichten, elk met de volgende informatie:

    • Een inhoudssegment op basis van x-ms-chunk-size of een intern berekende grootte totdat alle inhoud van totaal x-ms-content-length opeenvolgend wordt geüpload

    • De volgende headerinformatie over het inhoudssegment dat in elk PATCH-bericht wordt verzonden:

      Headerveld voor Logic Apps-aanvraag Waarde Type Description
      Inhoudsbereik <Bereik> Tekenreeks Het bytebereik voor het huidige inhoudssegment, inclusief de beginwaarde, de eindwaarde en de totale inhoudsgrootte, bijvoorbeeld: 'bytes=0-1023/10100'
      Content-Type <inhoudstype> Tekenreeks Het type gesegmenteerde inhoud
      Content-Length <lengte van inhoud> Tekenreeks De lengte van de grootte in bytes van het huidige segment
  4. Na elke PATCH-aanvraag bevestigt het eindpunt de ontvangst voor elk segment door te reageren met de statuscode '200' en de volgende antwoordheaders:

    Antwoordheaderveld eindpunt Type Vereist Beschrijving
    Bereik Tekenreeks Ja Het bytebereik voor inhoud die is ontvangen door het eindpunt, bijvoorbeeld: 'bytes=0-1023'
    x-ms-chunk-size Geheel getal No De voorgestelde segmentgrootte in bytes

Deze actiedefinitie toont bijvoorbeeld een HTTP POST-aanvraag voor het uploaden van gesegmenteerde inhoud naar een eindpunt. In de eigenschap van runTimeConfiguration de actie wordt met de contentTransfer eigenschap ingesteld transferMode op chunked:

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