Nagyméretű üzenetek kezelése munkafolyamatokban adattömbök használatával az Azure Logic Appsben
A következőkre vonatkozik: Azure Logic Apps (használat)
Az Azure Logic Apps különböző maximális korlátokkal rendelkezik az üzenettartalom méretére vonatkozóan, amelyeket az eseményindítók és műveletek képesek kezelni a logikaialkalmazás-munkafolyamatokban, a logikai alkalmazás erőforrástípusa és a logikai alkalmazás munkafolyamatát futtató környezet alapján. Ezek a korlátok segítenek csökkenteni a nagy méretű üzenetek tárolásából és feldolgozásából eredő többletterhelést. Az üzenetméretkorlátokról további információt az Üzenetkorlátok az Azure Logic Appsben című témakörben talál.
Ha beépített HTTP-műveleteket vagy adott felügyelt összekötőműveleteket használ, és az Azure Logic Appsnek az alapértelmezett korlátnál nagyobb üzeneteket kell használnia, engedélyezheti az adattömböket, amelyek kisebb üzenetekre osztanak fel egy nagy üzenetet. Így a nagy méretű fájlokat adott feltételek mellett is átviheti. Valójában, ha ezeket a beépített HTTP-műveleteket vagy adott felügyelt összekötőműveleteket használja, az adattömbkezelés az egyetlen módja annak, hogy az Azure Logic Apps nagy mennyiségű üzenetet használjon fel. Ez a követelmény azt jelenti, hogy vagy az Azure Logic Apps és más szolgáltatások közötti mögöttes HTTP-üzenetcserének adattömböket kell használnia, vagy a használni kívánt felügyelt összekötők által létrehozott kapcsolatoknak is támogatniuk kell az adattömböket.
Megjegyzés
Az Azure Logic Apps nem támogatja az eseményindítók adattömbbe helyezését, mivel a több üzenet cseréjével járó többletterhelés miatt. Az Azure Logic Apps emellett a jelen cikkben leírtak szerint a saját protokolljával valósítja meg a HTTP-műveletek adattömbökbe való beszúrását. Így még ha a webhelye vagy a webszolgáltatása is támogatja az adattömb-készítést, akkor sem fognak működni a HTTP-műveletrészletezéssel. Ahhoz, hogy HTTP-művelettömbolást használjon a webhelyével vagy a webszolgáltatással, ugyanazt a protokollt kell implementálnia, amelyet az Azure Logic Apps használ. Ellenkező esetben ne engedélyezze az adattömb-készítést a HTTP-műveletben.
Ez a cikk áttekintést nyújt arról, hogyan működik az adattömb az Azure Logic Appsben, és hogyan állíthatja be az adattömb-készítést a támogatott műveletekhez.
Mitől "nagyok" az üzenetek?
Az üzeneteket kezelő szolgáltatás alapján az üzenetek "nagyok". A nagy méretű üzenetekre vonatkozó pontos méretkorlát a Logic Apps és az összekötők között eltérő. A Logic Apps és az összekötők sem használhatnak közvetlenül nagy méretű üzeneteket, amelyeket át kell bontani. A Logic Apps üzenetméretkorlátját a Logic Apps korlátai és konfigurációja című témakörben talál. Az egyes összekötők üzenetméretkorlátjával kapcsolatban tekintse meg az összekötő referenciadokumentációját.
Adattömbalapú üzenetkezelés a Logic Appshez
A Logic Apps nem használhatja közvetlenül az üzenetméretkorlátnál nagyobb adattömbökből származó kimeneteket. Csak az adattömböket támogató műveletek férhetnek hozzá az üzenet tartalmához ezekben a kimenetekben. A nagyméretű üzeneteket kezelő műveletnek tehát az alábbi feltételeknek kell megfelelnie:
- Natív módon támogatja az adattömb-készítést, ha ez a művelet egy összekötőhöz tartozik.
- Engedélyezze az adattömb-támogatást a művelet futtatókörnyezeti konfigurációjában.
Ellenkező esetben futásidejű hibaüzenet jelenik meg, amikor nagy tartalomkimenetet próbál elérni. Az adattömb-készítés engedélyezéséhez lásd: Az adattömb-támogatás beállítása.
Adattömbök üzenetkezelése összekötőkhöz
A Logic Appsszel kommunikáló szolgáltatások saját üzenetméretkorlátokkal rendelkezhetnek. Ezek a korlátok gyakran kisebbek, mint a Logic Apps korlátja. Tegyük fel például, hogy egy összekötő támogatja az adattömb-készítést, előfordulhat, hogy egy összekötő egy 30 MB-os üzenetet nagy méretűnek tekint, míg a Logic Apps nem. Az összekötő korlátjának betartása érdekében a Logic Apps a 30 MB-nál nagyobb üzeneteket kisebb adattömbökre osztja fel.
Az adattömböket támogató összekötők esetében a mögöttes adattömb-protokoll láthatatlan a végfelhasználók számára. Azonban nem minden összekötő támogatja az adattömböket, ezért ezek az összekötők futásidejű hibákat okoznak, amikor a bejövő üzenetek túllépik az összekötők méretkorlátját.
Az adattömbök használatát támogató és engedélyezett műveletek esetén nem használhat triggertörzseket, változókat és kifejezéseket, például @triggerBody()?['Content']
azért, mert ezen bemenetek bármelyikének használata megakadályozza az adattömb-készítési művelet végrehajtását. Ehelyett használja a Compose műveletet. Konkrétan létre kell hoznia egy body
mezőt a Compose művelettel az eseményindító törzséből, változójából, kifejezéséből stb. származó adatkimenet tárolásához, például:
"Compose": {
"inputs": {
"body": "@variables('myVar1')"
},
"runAfter": {
"Until": [
"Succeeded"
]
},
"type": "Compose"
},
Ezután az adatokra való hivatkozáshoz az adattömb műveletben használja a következőt @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"
},
Adattömb beállítása HTTP-en keresztül
Általános HTTP-forgatókönyvekben feloszthatja a nagy méretű tartalomletöltéseket és -feltöltéseket HTTP-en keresztül, hogy a logikai alkalmazás és a végpont nagy mennyiségű üzenetet cserélhessenek. Az üzeneteket azonban a Logic Apps által elvárt módon kell beszednie.
Ha egy végpont engedélyezte az adattömbök letöltését vagy feltöltését, a logikai alkalmazás HTTP-műveletei automatikusan nagy méretű üzeneteket olvasnak el. Ellenkező esetben be kell állítania az adattömb-támogatást a végponton. Ha nem rendelkezik a végpont vagy az összekötő tulajdonosával vagy vezérlésével, előfordulhat, hogy nincs lehetősége az adattömb-készítés beállítására.
Ha egy HTTP-művelet még nem engedélyezi az adattömb-készítést, akkor az adattömb-készítést is be kell állítania a művelet tulajdonságában runTimeConfiguration
.
Ezt a tulajdonságot beállíthatja a műveleten belül, közvetlenül a kódnézet-szerkesztőben, a későbbiekben leírtak szerint, vagy a Logic Apps Designerben az itt leírtak szerint:
A HTTP-művelet jobb felső sarkában kattintson a három pontra (...), majd a Beállítások gombra.
A Tartalomátvitel területen állítsa az Adattömb engedélyezése beállítást Be értékre.
A letöltések vagy feltöltések adattömbök beállításának folytatásához folytassa az alábbi szakaszokkal.
Tartalom letöltése adattömbökben
Számos végpont automatikusan nagy méretű üzeneteket küld el adattömbökben, amikor egy HTTP GET-kérésen keresztül töltődik le. Ha http-en keresztül szeretne adatokat letölteni egy végpontról, a végpontnak támogatnia kell a részleges tartalomkéréseket vagy az adattömbök letöltését. Amikor a logikai alkalmazás HTTP GET-kérést küld egy végpontnak a tartalom letöltéséhez, és a végpont "206" állapotkóddal válaszol, a válasz adattömbben lévő tartalmat tartalmaz. A Logic Apps nem tudja szabályozni, hogy egy végpont támogatja-e a részleges kéréseket. Ha azonban a logikai alkalmazás megkapja az első "206" választ, a logikai alkalmazás automatikusan több kérést küld az összes tartalom letöltéséhez.
Annak ellenőrzéséhez, hogy egy végpont támogatja-e a részleges tartalmakat, küldjön EGY HEAD-kérést. Ez a kérés segít meghatározni, hogy a válasz tartalmazza-e a fejlécet Accept-Ranges
.
Így ha a végpont támogatja az adattömbök letöltését, de nem küld adattömböket, ezt a lehetőséget a HTTP GET-kérelem fejlécének Range
beállításával javasolhatja.
Ezek a lépések ismertetik azt a részletes folyamatot, amelyet a Logic Apps az adattömb tartalmainak végpontról a logikai alkalmazásba való letöltéséhez használ:
A logikai alkalmazás HTTP GET kérést küld a végpontnak.
A kérelemfejléc opcionálisan tartalmazhat egy
Range
mezőt, amely a tartalomtömbök igénylésére szolgáló bájttartományt írja le.A végpont a "206" állapotkóddal és egy HTTP-üzenettörzsgel válaszol.
Az ebben az adattömbben lévő tartalom részletei megjelennek a válasz
Content-Range
fejlécében, beleértve azokat az információkat, amelyek segítenek a Logic Appsnek meghatározni az adattömb kezdő és záró elemét, valamint a teljes tartalom teljes méretét az adattömb előtt.A logikai alkalmazás automatikusan küld nyomon követési HTTP GET-kéréseket.
A logikai alkalmazás a teljes tartalom lekéréséig küld nyomon követési GET-kéréseket.
Ez a műveletdefiníció például egy HTTP GET kérést jelenít meg, amely beállítja a fejlécet Range
.
A fejléc azt javasolja , hogy a végpontnak az adattömbbe becsomagolt tartalommal kell válaszolnia:
"getAction": {
"inputs": {
"headers": {
"Range": "bytes=0-1023"
},
"method": "GET",
"uri": "http://myAPIendpoint/api/downloadContent"
},
"runAfter": {},
"type": "Http"
}
A GET-kérelem a "Range" fejlécet "bytes=0-1023" értékre állítja, amely a bájtok tartománya. Ha a végpont támogatja a részleges tartalomra vonatkozó kéréseket, a végpont a kért tartományból származó tartalomrészlettel válaszol. A végponttól függően a "Tartomány" fejlécmező pontos formátuma eltérhet.
Tartalom feltöltése adattömbökbe
Ha egy HTTP-műveletből szeretné feltölteni az adattömb tartalmát, a műveletnek engedélyeznie kell az adattömb-támogatást a művelet tulajdonságán runtimeConfiguration
keresztül.
Ez a beállítás lehetővé teszi, hogy a művelet elindítsa az adattömb-protokollt.
A logikai alkalmazás ezután küldhet egy kezdeti POST vagy PUT üzenetet a célvégpontnak.
Miután a végpont egy javasolt adattömbmérettel válaszol, a logikai alkalmazás nyomon követi a tartalomtömböket tartalmazó HTTP PATCH-kérések küldésével.
Az alábbi lépések azt a részletes folyamatot írják le, amelyet a Logic Apps a logikai alkalmazásból egy végpontra történő adattömbbe való feltöltéshez használ:
A logikai alkalmazás egy kezdeti HTTP POST vagy PUT kérést küld egy üres üzenettörzsgel. A kérés fejléce a következő információkat tartalmazza a logikai alkalmazás által az adattömbökbe feltölteni kívánt tartalomról:
Logic Apps-kérelem fejlécmezője Érték Típus Description x-ms-transfer-mode adattömb Sztring Azt jelzi, hogy a tartalom adattömbökbe van feltöltve x-ms-content-length < tartalomhossz> Egész szám A teljes tartalomméret bájtban, adattömb előtt A végpont a "200" sikerességi állapotkóddal és a következő információkkal válaszol:
Végpont válaszfejlécének mezője Típus Kötelező Leírás Hely Sztring Yes Az URL-cím helye, ahová a HTTP PATCH-üzeneteket el kell küldeni x-ms-chunk-size Egész szám No A javasolt adattömbméret bájtban A logikai alkalmazás nyomon követő HTTP PATCH-üzeneteket hoz létre és küld el – ezek mindegyike a következő információkkal:
Egy x-ms-chunk-size vagy valamilyen belsőleg számított méreten alapuló tartalomtömb, amíg az összes x-ms-content-length értéket összegzi egymás után
Az egyes PATCH-üzenetekben küldött tartalomtömbre vonatkozó alábbi fejlécinformációk:
Logic Apps-kérelem fejlécmezője Érték Típus Description Tartalomtartomány < Tartomány> Sztring Az aktuális tartalomtömb bájttartománya, beleértve a kezdőértéket, a záróértéket és a teljes tartalomméretet, például: "bájt=0-1023/10100" Tartalomtípus < tartalomtípus> Sztring Az adattömbben lévő tartalom típusa Tartalomhossz < tartalomhossz> Sztring Az aktuális adattömb méretének hossza bájtban
Az egyes PATCH-kérések után a végpont az egyes adattömbök nyugtáit a "200" állapotkóddal és az alábbi válaszfejlécekkel válaszolja meg:
Végpont válaszának fejlécmezője Típus Kötelező Leírás Tartomány Sztring Yes A végpont által fogadott tartalom bájttartománya, például: "bytes=0-1023" x-ms-chunk-size Egész szám No A javasolt adattömbméret bájtban
Ez a műveletdefiníció például egy HTTP POST-kérést jelenít meg az adattömbben szereplő tartalom végpontra való feltöltéséhez. A művelet tulajdonságában runTimeConfiguration
a tulajdonság transferMode
chunked
értéke contentTransfer
:
"postAction": {
"runtimeConfiguration": {
"contentTransfer": {
"transferMode": "chunked"
}
},
"inputs": {
"method": "POST",
"uri": "http://myAPIendpoint/api/action",
"body": "@body('getAction')"
},
"runAfter": {
"getAction": ["Succeeded"]
},
"type": "Http"
}