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


Egyidejűség az Azure Functionsben

Az Azure Functionsben egyetlen függvényalkalmazás-példány lehetővé teszi több esemény egyidejű feldolgozását. Mivel ezek ugyanazon a számítási példányon futnak, memória-, PROCESSZOR- és kapcsolaterőforrásokkal rendelkeznek. Bizonyos üzemeltetési csomagokban egy adott példányra vonatkozó nagy igény miatt a Functions-gazdagép automatikusan új példányokat hoz létre a megnövekedett terhelés kezeléséhez. Ezekben a dinamikus méretezési tervekben kompromisszumok vannak az egyidejűség és a skálázási viselkedés között. Annak érdekében, hogy jobban szabályozhassa az alkalmazás működését, a Functions lehetővé teszi az egyidejű végrehajtások számának kezelését.

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

  • Kijavított példányonkénti egyidejűség: Konfigurálhatja az egyes eseményindítókra jellemző egyidejűség gazdagépszintű korlátait. Ez a modell a Functions alapértelmezett egyidejűségi viselkedése.
  • Dinamikus egyidejűség: Bizonyos eseményindító-típusok esetén a Functions-gazdagép automatikusan meg tudja határozni a függvényalkalmazásban az adott eseményindító számára a legjobb egyidejűséget. Ehhez az egyidejűségi modellhez kell csatlakoznia.

Ez a cikk az eseményvezérelt eseményindítók egyidejű viselkedését ismerteti a Functionsben, valamint azt, hogy ezek a viselkedések hogyan befolyásolják a dinamikus tervek skálázását. Összehasonlítja a példányonként rögzített és a dinamikus egyidejűségi modelleket is.

Skálázás és egyidejűség

Eseményalapú eseményindítókat használó vagy HTTP-kérelmekre reagáló függvények esetén gyorsan elérheti az egyidejű végrehajtások korlátait a nagy igényű időszakokban. Ezekben az időszakokban képesnek kell lennie a függvényalkalmazás skálázására példányok hozzáadásával, hogy elkerülje a bejövő kérések feldolgozásának hátralékát. Az alkalmazás méretezésének módja az üzemeltetési csomagtól függ:

Méretezés típusa Üzemeltetési tervek Leírás
Dinamikus (eseményvezérelt) skálázás Consumption
Rugalmas felhasználás
Prémium
A dinamikus méretezési tervben 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 az Azure Functionsben.
Manuális skálázás Dedikált (App Service-) csomagok Ha dedikált csomagban üzemelteti a függvényalkalmazást, manuálisan kell konfigurálnia a példányokat a nagyobb terhelésű időszakokban, vagy be kell állítania egy automatikus méretezési sémát.

Mielőtt bármilyen skálázás történne, a függvényalkalmazás megkísérli kezelni a terhelésnövekedést úgy, hogy egyetlen példányban több, azonos típusú meghívást kezel. Ennek eredményeképpen ezek az egyidejű végrehajtások egy adott példányon közvetlenül befolyásolják a méretezési döntéseket. Ha például egy dinamikus méretezési tervben lévő alkalmazás eléri az egyidejűségi korlátot, előfordulhat, hogy skáláznia kell, hogy lépést tartson a bejövő kereslettel.

Az alkalmazásban elérni kívánt skálázás és egyidejűség egyensúlya attól függ, hogy hol fordulhatnak elő szűk keresztmetszetek: a feldolgozásban (processzorigényes folyamatkorlátozások) vagy egy alsóbb rétegbeli szolgáltatásban (I/O-alapú korlátozások).

Példányonkénti egyidejűség kijavítva

Alapértelmezés szerint a legtöbb eseményindító támogatja a példányonkénti egyidejűségi konfigurációs modellt a célalapú skálázáson keresztül. 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ó egyidejűségi alapértelmezett értékeit felülbírálhatja egy adott példányonkénti egyidejűség beállításával az adott triggertípushoz. Számos eseményindító esetén konfigurálja az egyidejűségi beállításokat a host.json fájlban. Az Azure Service Bus-eseményindító például biztosít egy MaxConcurrentCalls és egy MaxConcurrentSessions beállítást a host.json-ben. Ezek a beállítások együttesen szabályozzák az egyes függvényalkalmazások által az egyes példányokon egyidejűleg feldolgozandó üzenetek maximális számát.

Bizonyos célalapú skálázási forgatókönyvekben, például apache Kafka vagy Azure Cosmos DB-eseményindító használatakor az egyidejűség konfigurációja a függvénydeklarációban van, nem pedig a host.json fájlban. Más triggertípusok rendelkeznek beépített mechanizmusokkal a hívások példányok közötti terheléselosztására. Az Azure 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 az egyidejűségi beállítások az összes futó példányra érvényesek. Így szabályozhatja a függvények maximális egyidejűségét az egyes példányokon. Ha például a függvény processzorigényes vagy erőforrás-igényes, az egyidejűség korlátozását is választhatja a példányok kifogástalan állapotának megőrzése érdekében. Ebben az esetben a skálázásra támaszkodhat a megnövekedett terhelés kezelése érdekében. Hasonlóképpen, amikor a függvény kéréseket küld egy szabályozott alárendelt szolgáltatáshoz, érdemes korlátozni az egyidejűséget, hogy elkerülje az alsóbb rétegbeli szolgáltatás túlterhelését.

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

Csak a Rugalmas kihasználtság csomagra vonatkozik

A HTTP-eseményindító egyidejűsége a példányonkénti rögzített egyidejűség speciális típusa. A HTTP-eseményindító egyidejűségében az alapértelmezett egyidejűség a példány méretétől is függ.

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*
512 4
2,048 16
4,096 32

*A Python-alkalmazásokban az összes példányméret alapértelmezés szerint egy HTTP-eseményindító egyidejűségi szintjét használja.

Ezeknek az alapértelmezett értékeknek a legtöbb esetben jól kell működniük, és elkezdheti őket. 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. Hasonlóképpen, a HTTP egyidejűségi értékének csökkentése több példányt igényel 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ázat alapértelmezett egyidejűségi értékei csak akkor érvényesek, ha nem állít be saját HTTP-egyidejűségi beállítást. Ha nem állít be explicit módon 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.

Az optimális példányonkénti fix egyidejűség meghatározása

A példányonként rögzített egyidejűségi konfigurációk bizonyos eseményindító-viselkedéseket szabályoznak, például a függvények szabályozását. Ezekhez a beállításokhoz azonban nehéz lehet meghatározni az optimális értékeket. A terheléstesztelés iteratív folyamatával általában elfogadható értékeket kell elérnünk. Az adott terhelésprofilhoz tartozó értékek meghatározása után is napról napra változhat a csatlakoztatott szolgáltatásokból érkező események száma. Ez a variabilitás azt eredményezheti, hogy az alkalmazás nem optimális értékekkel fut. Előfordulhat például, hogy a függvényalkalmazás a hét utolsó napján dolgozza fel az igényes üzenetek hasznos adatait, ami megköveteli az egyidejűség leállítását. A hét hátralévő részében azonban az üzenet terhelése kisebb lehet, ami azt jelenti, hogy magasabb egyidejűségi szintet használhat.

Ideális esetben a rendszernek lehetővé kell tennie, hogy a példányok annyi munkát dolgozzanak fel, amennyit csak tudnak, miközben az egyes példányok állapota és késése alacsony marad. A dinamikus egyidejűség erre a célra lett kialakítva.

Dinamikus egyidejűség

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

Feljegyzés

A dinamikus egyidejűség jelenleg csak az Azure Blob Storage, az Azure Queue Storage és a Service Bus-eseményindítók esetében támogatott. Emellett a bővítménytámogatásban szereplő bővítményverziókat is használnia kell a jelen cikk későbbi részében.

Juttatások

A dinamikus egyidejűség a következő előnyöket biztosítja:

  • 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 azokra a szintekre, amelyeket a függvényalkalmazás-példányok kényelmesen kezelhetnek. Ezek a korlátok védik 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, mivel az egyes példányok nem kérnek le több munkát, mint amennyit gyorsan feldolgozhatnak. Ennek eredményeképpen a feladatok terheléselosztása hatékonyabban történik az egyes 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éget a host.json fájl gazdagépszintjén kapcsolhatja be. Ha be van kapcsolva, 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 ki van kapcsolva. A dinamikus egyidejűség bekapcsolásakor az egyidejűség minden függvényhez egy szinttel kezdődik. Az egyidejűségi szint egy optimális értékre van beállítva, amelyet a kiszolgáló határoz meg.

A függvényalkalmazásban a dinamikus egyidejűség bekapcsolásához adja hozzá a következő beállításokat a host.json fájlhoz:

    { 
        "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. Az új példányok ezekből az értékekből indulnak, ahelyett hogy alapszintről indulnának, és újra kellene kezdeni a tanulást.

Egyidejűség-kezelő

A színfalak mögött, amikor a dinamikus egyidejűség be van kapcsolva, az 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 throttle be van kapcsolva, a függvény egyidejű működése csökkentve lesz, amíg a gazdagép ismét egészséges állapotba nem kerül. Ha a fojtószelepek ki vannak kapcsolva, 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. Mivel időbe telhet az optimális egyidejűségi érték meghatározása, csak akkor használjon dinamikus egyidejűséget, ha a megoldáshoz kezdetben vagy egy inaktivitási időszak után elfogadható egy optimálisnál rosszabb érték.

Az egyidejűségi szinteket az egyes függvények kezelik. Pontosabban, a rendszer kiegyensúlyozza az erőforrás-igényes függvényeket, amelyek alacsony szintű egyidejűséget igényelnek, és a könnyebb függvényeket, amelyek képesek magasabb egyidejűséget kezelni. 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 a dinamikus egyidejűség be van kapcsolva, dinamikus egyidejűségi döntéseket talál a naplókban. A naplóbejegyzések például akkor jelennek meg, ha a különböző szabályozások be vannak kapcsolva, és amikor az egyidejűség az egyes függvények esetében fel- vagy le 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
Sorok tárolása 5.x-es verzió (Storage-bővítmény) A Queue Storage-eseményindító saját üzenet-lekérdezési ciklussal rendelkezik. Ha rögzített példányonkénti konfigurációt használ, a BatchSize és NewBatchThreshold konfigurációs beállítások szabályozzák az egyidejűséget. 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 be vannak kapcsolva a fojtószelepek, a gazdagép túlterhelt. Az üzenetfeldolgozás szünetel, amíg a fojtások ki nem kapcsolásra kerülnek. Ha a fojtás ki van kapcsolva, az egyidejűség nő.
Blob Storage 5.x-es verzió (Storage-bővítmény) A Blob Storage-eseményindító belsőleg ugyanazt az infrastruktúrát használja, amelyet a Queue Storage-eseményindító használ. Amikor új vagy frissített blobokat kell feldolgozni, a rendszer egy platform által felügyelt vezérlősorba írja az üzeneteket. Az üzenetsor feldolgozása a Queue Storage-eseményindítóhoz használt logikával történik. Ha a dinamikus egyidejűség be van kapcsolva, a rendszer dinamikusan kezeli a vezérlősor feldolgozásának egyidejűségét.
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 a következő módokon befolyásolja ezeket a végrehajtási modelleket:
  • Önálló küldési témakör/üzenetsor feldolgozása: A függvény minden hívása egyetlen üzenetet dolgoz fel. Ha fix példányonkénti konfigurációt használ, a MaxConcurrentCalls konfigurációs beállítás szabályozza az egyidejűséget. 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ú egyszeri 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 vagy üzenetsor aktív munkameneteinek számától függően minden példány egy vagy több munkamenetet bérel. Az egyes munkamenetekben lévő üzeneteket a rendszer sorosan dolgozza fel, hogy garantálhassa a munkamenetek sorrendjét. Ha nem használ dinamikus egyidejűséget, a beállítás szabályozza az MaxConcurrentSessions egyidejűséget. Ha a dinamikus egyidejűség be van kapcsolva, a rendszer figyelmen kívül hagyja az MaxConcurrentSessions értéket, é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: