Megosztás a következőn keresztül:


Egyidejűség az Azure Functionsben

Ez a cikk az Eseményvezérelt eseményindítók egyidejű viselkedését ismerteti az Azure Functionsben. A statikus és dinamikus egyidejűségi modelleket is összehasonlítja.

A Functionsben egy adott függvény több végrehajtási folyamata is futtatható egyszerre egyetlen számítási példányon. Vegyük például azt az esetet, amikor három különböző függvény található a függvényalkalmazásban, amelyek több példányra vannak skálázva a megnövekedett terhelés kezelése érdekében. Ebben a forgatókönyvben az egyes függvények mind a három példány egyéni meghívására reagálva hajtanak végre, és egy adott példány több, azonos típusú meghívást is képes kezelni. Ne feledje, hogy az egy példányon végrehajtott függvények memóriája, processzora és kapcsolati erőforrásai azonosak. Mivel egyszerre több függvényvégrehajtás is futtatható az egyes példányokon, minden függvénynek rendelkeznie kell az egyidejű végrehajtások számának kezelésére.

Ha az alkalmazást dinamikus méretezési csomagban üzemeltetik (Felhasználás, Rugalmas használat vagy Prémium), a gazdagép felfelé vagy lefelé skálázza a függvényalkalmazás-példányok számát a bejövő események száma alapján. További információ: Eseményvezérelt skálázás. Ha dedikált (App Service-) csomagban üzemelteti a függvényeket, manuálisan kell konfigurálnia a példányokat, vagy be kell állítania egy automatikus méretezési sémát.

Ezeket a méretezési döntéseket az adott példányon végrehajtott végrehajtások egyidejűsége is közvetlenül befolyásolja. Ha egy dinamikus méretezési tervben lévő alkalmazás egyidejűségi korlátot ér el, előfordulhat, hogy skáláznia kell, hogy lépést tartson a bejövő kereslettel.

A Functions két fő módszert kínál az egyidejűség kezelésére:

  • Statikus egyidejűség: Konfigurálhatja az egyidejűség gazdagépszintű korlátait, amelyek egyedi eseményindítókra vonatkoznak. Ez a Függvények alapértelmezett egyidejűségi viselkedése.

  • Dinamikus egyidejűség: Bizonyos triggertípusok esetében a Functions-gazdagép automatikusan meg tudja határozni az adott eseményindítóhoz tartozó legjobb egyidejűségi szintet az alkalmazásban. Ehhez az egyidejűségi modellhez kell csatlakoznia.

Statikus egyidejűség

Alapértelmezés szerint a legtöbb eseményindító támogatja a gazdagépszintű statikus konfigurációs modellt. Ebben a modellben minden eseményindító-típushoz példányonkénti egyidejűségi korlát tartozik. A legtöbb eseményindító esetében azonban adott példányonkénti egyidejűséget is kérhet az adott triggertípushoz. A Service Bus-eseményindító például egy MaxConcurrentCalls és egy MaxConcurrentSessions beállítást is biztosít a host.json fájlban. Ezek a beállítások együttesen szabályozzák az egyes függvények által az egyes példányokon egyidejűleg futó üzenetek maximális számát. Más triggertípusok beépített mechanizmusokkal rendelkeznek a példányok közötti terheléselosztási meghívásokhoz. Az Event Hubs és az Azure Cosmos DB például partícióalapú sémát használ.

Az egyidejűségi konfigurációt támogató eseményindító-típusok esetében a rendszer az összes futó példányra alkalmazza a választott beállításokat. Ez lehetővé teszi a függvények maximális egyidejűségének szabályozását az egyes példányokon. Ha például a függvény processzor- vagy erőforrásigényes, akkor az egyidejűség korlátozásával megőrizheti a példányok kifogástalan állapotát, és skálázásra támaszkodhat a megnövekedett terhelés kezelése érdekében. Hasonlóképpen, ha a függvény egy szabályozott alsóbb rétegbeli szolgáltatásra irányuló kéréseket küld, érdemes megfontolnia az egyidejűség korlátozását is, hogy elkerülje az alsóbb rétegbeli szolgáltatás túlterhelését.

HTTP-eseményindító egyidejűsége

Csak a Flex Consumption csomagra vonatkozik (előzetes verzió)

A Flex Consumption csomag az összes HTTP-eseményindítót csoportként skálázza. További információ: Függvényenkénti skálázás. Az alábbi táblázat egy adott példány HTTP-eseményindítóinak alapértelmezett egyidejűségi beállítását jelzi a példányok konfigurált memóriamérete alapján.

Példány mérete (MB) Alapértelmezett egyidejűség*
2048 16
4096 32

*Python-alkalmazások esetén az alapértelmezett HTTP-eseményindító egyidejűsége minden példányméret esetében a következő 1.

Ezeknek az alapértelmezett értékeknek a legtöbb esetben jól kell működniük, és először is velük kell kezdeniük. Vegye figyelembe, hogy adott számú HTTP-kérés esetén a HTTP egyidejűségi értékének növelése csökkenti a HTTP-kérelmek kezeléséhez szükséges példányok számát. Ugyanígy a HTTP egyidejűségi értékének csökkentéséhez több példányra van szükség ugyanazon terhelés kezeléséhez.

Ha finomhangolnia kell a HTTP-egyidejűséget, ezt az Azure CLI használatával teheti meg. További információ: HTTP egyidejűségi korlátok beállítása.

Az előző táblázatban szereplő alapértelmezett egyidejűségi értékek csak akkor érvényesek, ha még nem állította be a saját HTTP-egyidejűségi beállítását. Ha nem állított be kifejezetten HTTP egyidejűségi beállítást, az alapértelmezett egyidejűség a példány méretének módosításakor a táblázatban látható módon nő. Miután konkrétan beállított egy HTTP-egyidejűségi értéket, a rendszer a példány méretének változása ellenére is megőrzi ezt az értéket.

Optimális statikus egyidejűség meghatározása

Bár a statikus egyidejűségi konfigurációk bizonyos eseményindítók viselkedését, például a függvények szabályozását biztosítják, nehéz lehet meghatározni ezeknek a beállításoknak az optimális értékeit. A terheléstesztelés iteratív folyamatával általában elfogadható értékeket kell elérnünk. A csatlakoztatott szolgáltatásokból érkező események száma napról napra változhat, miután meghatározta egy adott terhelésprofilhoz tartozó értékek készletét. Ez a variabilitás azt jelenti, hogy az alkalmazás gyakran nem optimális értékekkel fut. Előfordulhat például, hogy a függvényalkalmazás a hét utolsó napján különösen nagy terhelésű üzeneteket dolgoz fel, ami megköveteli az egyidejűség szabályozását. A hét hátralévő részében azonban az üzenet hasznos adatai egyszerűbbek, ami azt jelenti, hogy a hét többi részében magasabb egyidejűségi szintet használhat.

Ideális esetben azt szeretnénk, hogy a rendszer lehetővé tegye a példányok számára, hogy a lehető legtöbb munkát dolgozzák fel, miközben az egyes példányok kifogástalan állapotban és késésben vannak, és ezt a dinamikus egyidejűséget tervezték.

Dinamikus egyidejűség

A Functions mostantól egy dinamikus egyidejűségi modellt biztosít, amely leegyszerűsíti az egyidejűség konfigurálását az ugyanabban a csomagban futó összes függvényalkalmazáshoz.

Feljegyzés

A dinamikus egyidejűség jelenleg csak az Azure Blob-, az Azure Queue- és a Service Bus-eseményindítók esetében támogatott, és az alábbi bővítménytámogatási szakaszban felsorolt verziókat kell használnia.

Juttatások

A dinamikus egyidejűség a következő előnyöket nyújtja:

  • Egyszerűsített konfiguráció: Többé nem kell manuálisan meghatároznia az eseményindítónkénti egyidejűségi beállításokat. A rendszer idővel megtanulja a számítási feladat optimális értékeit.
  • Dinamikus kiigazítások: Az egyidejűség dinamikusan, valós időben állítható be, ami lehetővé teszi, hogy a rendszer alkalmazkodjon a változó terhelési mintákhoz az idő függvényében.
  • Példányállapot-védelem: A futtatókörnyezet korlátozza az egyidejűséget olyan szintekre, amelyeken a függvényalkalmazás-példányok kényelmesen kezelhetők. Ez megvédi az alkalmazást attól, hogy túlterhelje magát azáltal, hogy több munkát végez, mint kellene.
  • Továbbfejlesztett átviteli sebesség: Az általános átviteli sebesség javul, mert az egyes példányok nem végeznek több munkát, mint amennyit gyorsan feldolgozhatnak. Ez lehetővé teszi a munka terheléselosztását a példányok között. A nagyobb terheléseket kezelő függvények esetében magasabb átviteli sebesség érhető el az alapértelmezett konfigurációnál magasabb értékek egyidejűségének növelésével.

Dinamikus egyidejűségi konfiguráció

A dinamikus egyidejűség a host.json fájl gazdagépszintjén engedélyezhető. Ha engedélyezve van, a funkciót támogató kötésbővítmények egyidejűségi szintjei szükség szerint automatikusan módosulnak. Ezekben az esetekben a dinamikus egyidejűségi beállítások felülbírálják a manuálisan konfigurált egyidejűségi beállításokat.

Alapértelmezés szerint a dinamikus egyidejűség le van tiltva. Ha engedélyezve van a dinamikus egyidejűség, az egyidejűség minden függvénynél 1-nél kezdődik, és a gazdagép által meghatározott optimális értékhez van igazítva.

A függvényalkalmazásban a következő beállítások hozzáadásával engedélyezheti a dinamikus egyidejűséget a host.json fájlban:

    { 
        "version": "2.0", 
        "concurrency": { 
            "dynamicConcurrencyEnabled": true, 
            "snapshotPersistenceEnabled": true 
        } 
    } 

Ha SnapshotPersistenceEnabled ez trueaz alapértelmezett érték, a rendszer rendszeresen megőrzi a tanult egyidejűségi értékeket a tárolóban, így az új példányok az 1-től kezdődő és a tanulás újrakezdése helyett ezekből az értékekből indulnak ki.

Egyidejűség-kezelő

A színfalak mögött, ha a dinamikus egyidejűség engedélyezve van, egy egyidejűség-kezelő folyamat fut a háttérben. Ez a kezelő folyamatosan figyeli a példányok állapotmetrikáit, például a processzor- és szálkihasználtságot, és szükség szerint módosítja a szabályozásokat. Ha egy vagy több szabályozás engedélyezve van, a függvény egyidejűsége mindaddig vissza lesz állítva, amíg a gazdagép ismét kifogástalan állapotba nem kerül. Ha a szabályozások le vannak tiltva, az egyidejűség növekedhet. A különböző heurisztikus módszerek segítségével intelligensen állíthatja be az egyidejűséget a szabályozások alapján, szükség szerint felfelé vagy lefelé. Idővel az egyes függvények egyidejűsége egy adott szintre stabilizálódik.

Az egyidejűségi szinteket az egyes függvények kezelik. Így a rendszer egyensúlyban van az olyan erőforrás-igényes függvények között, amelyek alacsony szintű egyidejűséget igényelnek, és a magasabb egyidejűséget képes kezelni képes egyszerűsített függvények között. Az egyes függvények egyidejűségének egyensúlya segít fenntartani a függvényalkalmazás-példány általános állapotát.

Ha engedélyezve van a dinamikus egyidejűség, dinamikus egyidejűségi döntéseket fog látni a naplókban. A naplók például akkor jelennek meg, ha a különböző szabályozások engedélyezve vannak, és ha az egyidejűség az egyes függvények esetében felfelé vagy lefelé van állítva. Ezek a naplók a Traces tábla Host.Concurrency napló kategóriájában vannak megírva.

Bővítménytámogatás

A dinamikus egyidejűség engedélyezve van egy függvényalkalmazás esetében a gazdagép szintjén, és a dinamikus egyidejűséget támogató bővítmények ebben a módban futnak. A dinamikus egyidejűség megköveteli a gazdagép és az egyes triggerbővítmények közötti együttműködést. Csak a következő bővítmények felsorolt verziói támogatják a dinamikus egyidejűséget.

Mellék Verzió Leírás
Queue Storage 5.x-es verzió (Storage-bővítmény) Az Azure Queue Storage-eseményindító saját üzenet-lekérdezési ciklussal rendelkezik. Statikus konfiguráció használatakor az egyidejűséget a BatchSize/NewBatchThreshold konfigurációs beállítások szabályozzák. Dinamikus egyidejűség használatakor a rendszer figyelmen kívül hagyja ezeket a konfigurációs értékeket. A dinamikus egyidejűség integrálva van az üzenethurokba, így az iterációnként lekért üzenetek száma dinamikusan módosul. Ha engedélyezve vannak a szabályozások (a gazdagép túlterhelt), az üzenetek feldolgozása felfüggesztve lesz, amíg le nem tiltja a szabályozásokat. Ha a szabályozások le vannak tiltva, az egyidejűség növekedni fog.
Blob Storage 5.x-es verzió (Storage-bővítmény) Az Azure Blob Storage-eseményindító belsőleg ugyanazt az infrastruktúrát használja, amelyet az Azure Queue Trigger használ. Amikor új/frissített blobokat kell feldolgozni, a rendszer egy platform által felügyelt vezérlősorba írja az üzeneteket, és az üzenetsor feldolgozása a QueueTriggerhez használt logikával történik. Ha a dinamikus egyidejűség engedélyezve van, a vezérlősor feldolgozásának egyidejűsége dinamikusan lesz felügyelve.
Szolgáltatásbusz 5.x-es verzió A Service Bus-eseményindító jelenleg három végrehajtási modellt támogat. A dinamikus egyidejűség az alábbiak szerint befolyásolja ezeket a végrehajtási modelleket:

Egyetlen küldési témakör/üzenetsor feldolgozása: A függvény minden hívása egyetlen üzenetet dolgoz fel. Statikus konfiguráció használatakor az egyidejűséget a MaxConcurrentCalls konfigurációs beállítás szabályozza. Dinamikus egyidejűség használatakor a konfigurációs érték figyelmen kívül lesz hagyva, és az egyidejűség dinamikusan módosul.
Munkamenet-alapú önálló küldési témakör/üzenetsor feldolgozása: A függvény minden hívása egyetlen üzenetet dolgoz fel. A témakör/üzenetsor aktív munkameneteinek számától függően minden példány egy vagy több munkamenetet ad bérbe. Az egyes munkamenetekben lévő üzeneteket a rendszer sorosan dolgozza fel, hogy garantálhassa a munkamenetek sorrendjét. Ha a dinamikus egyidejűség nincs használatban, az egyidejűséget a MaxConcurrentSessions beállítás szabályozza. Ha engedélyezve van a dinamikus egyidejűség, MaxConcurrentSessions a rendszer figyelmen kívül hagyja, és az egyes példányok által feldolgozott munkamenetek száma dinamikusan módosul.
Kötegelt feldolgozás: A függvény minden egyes meghívása egy üzenetköteget dolgoz fel, amelyet a MaxMessageCount beállítás szabályoz. Mivel a köteghívások sorosak, a köteg által aktivált függvény egyidejűsége mindig egy, és a dinamikus egyidejűség nem érvényes.

Következő lépések

További információt a következő források tartalmaznak: