Üzenetsor-alapú terheléskiegyenlítési minta

Azure Functions
Azure Service Bus

Használjon olyan üzenetsort, amely pufferként működik egy tevékenység és egy általa meghívott szolgáltatás között, hogy zökkenőmentes legyen az időszakos, nagy terhelés, amely a szolgáltatás meghiúsulását vagy a feladat időtúllépését okozhatja. Ez segíthet minimalizálni az igény csúcspontjainak a rendelkezésre állásra és a válaszképességre gyakorolt hatását mind a tevékenység, mind a szolgáltatás esetében.

Kontextus és probléma

A felhőben számos megoldás futtat szolgáltatásokat meghívó feladatokat. Ebben a környezetben ha egy szolgáltatás időszakos nagy terheléseknek van kitéve, az a teljesítménnyel és a megbízhatósággal kapcsolatos problémákat okozhat.

A szolgáltatások ugyanazon megoldás részei lehetnek, mint az azt használó feladatok, vagy külső szolgáltatások lehetnek, amelyek hozzáférést nyújtanak a gyakran használt erőforrásokhoz, például egy gyorsítótárhoz vagy egy társzolgáltatáshoz. Ha több egyidejűleg futó feladat ugyanazt a szolgáltatást használja, egy adott időpillanatban nehéz lehet megjósolni a szolgáltatás felé irányuló kérések mennyiségét.

A szolgáltatásban időszakonként csúcsok jelentkezhetnek az igényekben, amelyek túlterhelést okozhatnak, így a szolgáltatás nem tud időben válaszolni a kérésekre. A szolgáltatások számos egyidejű kéréssel való elárasztása is a szolgáltatás meghiúsulását eredményezheti, ha nem tudja kezelni a kérések okozta versenyt.

Megoldás

Bontsa újra a megoldást, és vezessen be egy üzenetsort a feladat és a szolgáltatás között. A feladatok és a szolgáltatás aszinkron módon fut. A feladat közzéteszi a szolgáltatás számára szükséges adatokat tartalmazó üzenetet egy üzenetsorba. Az üzenetsor pufferként működik, addig tárolja az üzenetet, amíg azt a szolgáltatás le nem kéri. A szolgáltatás lekéri az üzeneteket az üzenetsorból, és feldolgozza őket. Egy adott üzenetsorban számos különféle feladatból származó kérés adható át a szolgáltatásnak, amelyek rendkívül változó sebességgel jöhetnek létre. Ez az ábra egy szolgáltatás terhelésének kiegyenlítésére szolgáló üzenetsor használatát mutatja be.

1. ábra – Szolgáltatás terhelésének kiegyenlítésére szolgáló üzenetsor használata

Az üzenetsor leválasztja a feladatokat a szolgáltatásról, és a szolgáltatás a saját tempójában tudja kezelni az üzeneteket az egyidejű feladatoktól érkező kérések mennyiségétől függetlenül. Emellett a feladatok nem késnek, ha a szolgáltatás nem érhető el, amikor üzenetet tesznek közzé az üzenetsorba.

Ez a minta az alábbi előnyökkel jár:

  • Maximálisra növeli a rendelkezésre állást, mert a szolgáltatásokban felmerülő késések nincsenek azonnali és közvetlen hatással az alkalmazásra, amely akkor is folytathatja az üzenetek üzenetsorba való közzétételét, amikor a szolgáltatás nem érhető el vagy épp nem dolgoz fel üzeneteket.

  • Segít a skálázhatóság maximalizálásában, mert az üzenetsorok száma és a szolgáltatások száma is módosítható igény szerint.

  • A segítségével kézben tarthatók a költségek, mert az üzembe helyezett szolgáltatáspéldányok számának csak az átlagos terheléshez kell elegendőnek lennie, a csúcsterheléshez nem.

    Egyes szolgáltatások szabályozást alkalmaznak, amikor az igények elérnek egy olyan küszöbértéket, amelyet követően a rendszer meghibásodhat. A szabályozás csökkentheti az elérhető funkciókat. Ezekkel a szolgáltatásokkal terheléskiegyenlítést valósíthat meg annak érdekében, hogy ne érje el ezt a küszöbértéket.

Problémák és megfontolandó szempontok

A minta megvalósítása során az alábbi pontokat vegye figyelembe:

  • Olyan alkalmazáslogikát kell megvalósítani, amely szabályozza a szolgáltatások általi üzenetkezelés sebességét, hogy a cél erőforrás ne legyen túlterhelve. Ne adjon át igénybevételi csúcsokat a rendszer más részeinek. Tesztelje a terhelés alatti rendszert annak ellenőrzéséhez, hogy az biztosítja-e a megfelelő terheléskiegyenlítést, és ennek megfelelően módosítsa az üzeneteket kezelő üzenetsorok és szolgáltatáspéldányok számát.
  • Az üzenetsorok egyirányú kommunikációs mechanizmusok. Ha egy feladat válaszra vár egy szolgáltatástól, előfordulhat, hogy olyan mechanizmust kell implementálni, amellyel a szolgáltatás választ tud küldeni. További információkért lásd az aszinkron üzenetkezelés ismertetését.
  • Legyen óvatos, ha automatikus skálázást alkalmaz azokra a szolgáltatásokra, amelyek figyelik az üzenetsoron lévő kéréseket. Ez megnövekedett versenyt eredményezhet az ezen szolgáltatások által megosztott erőforrásokért, és csökkenti az üzenetsor hatékonyságát a terhelés kiegyenlítése terén.
  • A szolgáltatás terhelésétől függően olyan helyzetbe is belefuthat, amikor hatékonyan mindig lemarad, ahol a rendszer mindig több kérést állít össze, mint amennyit feldolgoz. Figyelembe kell venni az alkalmazás bejövő forgalmának variabilitását
  • A minta adatvesztést okozhat a várólista megőrzésétől függően. Ha az üzenetsor összeomlik vagy adatokat töröl (a rendszer korlátai miatt), előfordulhat, hogy nem rendelkezik garantált kézbesítéssel. A megoldás igényeinek megfelelően figyelembe kell venni az üzenetsor és a rendszer korlátainak viselkedését.

Mikor érdemes ezt a mintát használni?

Ez a minta olyan alkalmazásokhoz hasznos, amelyek gyakran túlterhelt szolgáltatásokat használnak.

Ez a minta nem használható jól, ha az alkalmazás minimális késéssel vár választ a szolgáltatástól.

Számítási feladatok tervezése

Az építészeknek értékelniük kell, hogyan használható a várólista-alapú terheléselosztási minta a számítási feladat kialakításában az Azure Well-Architected Framework pilléreiben foglalt célok és alapelvek kezelésére. Példa:

Pillér Hogyan támogatja ez a minta a pillércélokat?
A megbízhatósági tervezési döntések segítenek a számítási feladatnak ellenállóvá válni a hibás működéssel szemben, és biztosítani, hogy a hiba bekövetkezése után teljesen működőképes állapotba kerüljön. Az ebben a mintában leírt megközelítés rugalmasságot biztosíthat a hirtelen megnövekedett kereslet ellen azáltal, hogy leválasztja a tevékenységek érkezését a feldolgozásukról. Elkülönítheti az üzenetsor-feldolgozás hibáit is, hogy ne befolyásolják a bevitelt.

- RE:06 Skálázás
- RE:07 Háttérfeladatok
A költségoptimalizálás a számítási feladatok megtérülésének fenntartására és javítására összpontosít. Mivel a terhelésfeldolgozás leválasztva van a kérésről vagy a tevékenységbevitelről, ezzel a módszerrel csökkentheti az erőforrások túlterheltségének szükségességét a csúcsterhelés kezeléséhez.

- CO:12 skálázási költségek
A teljesítményhatékonyság a skálázás, az adatok és a kód optimalizálásával segíti a számítási feladatok hatékony kielégítését . Ez a megközelítés lehetővé teszi az átviteli sebesség szándékos tervezését, mivel a kérelmek bevitelének nem kell korrelálnia a feldolgozásuk sebességével.

- PE:05 Skálázás és particionálás

Mint minden tervezési döntésnél, fontolja meg az ezzel a mintával bevezethető többi pillér céljaival szembeni kompromisszumokat.

Példa

Egy webalkalmazás adatokat ír egy külső adattárba. Ha a webalkalmazás nagy számú példánya fut egyidejűleg, előfordulhat, hogy az adattár nem tud elég gyorsan válaszolni a kérésekre, így a kérések időtúllépést, szabályozást vagy egyéb módon meghiúsulást okoznak. Az alábbi ábra azt mutatja be, hogy egy adattárat túlterhelt egy alkalmazás példányaitól érkező nagyszámú egyidejű kérés.

2. ábra – Egy webalkalmazás példányaitól érkező nagyszámú egyidejű kérés túlterhelt egy szolgáltatást

Ennek megoldásához egy üzenetsor használatával simítheti a terhelést az alkalmazáspéldányok és az adattár között. Egy Azure Functions-alkalmazás beolvassa az üzeneteket az üzenetsorból, és végrehajtja az olvasási/írási kéréseket az adattárba. A függvényalkalmazás alkalmazáslogika szabályozhatja, hogy milyen sebességgel továbbítja a kéréseket az adattárnak, hogy megakadályozza az áruház túlterheltségét. (Ellenkező esetben a függvényalkalmazás csak újra bevezeti ugyanazt a problémát a háttérrendszerben.)

3. ábra – Üzenetsor és függvényalkalmazás használata a terhelés simításához

Következő lépések

Az alábbi útmutatók segíthetnek a minta megvalósításakor:

  • Az aszinkron üzenetkezelés ismertetése. Az üzenetsorok eredendően aszinkron típusúak. Előfordulhat, hogy egy feladatban újra kell tervezni az alkalmazáslogikát a szolgáltatással való közvetlen kommunikációról üzenetsor használatára. Hasonlóképpen szükség lehet a szolgáltatások újrabontására, hogy kéréseket fogadjanak el egy üzenetsortól. Másik lehetőségként meg lehet valósítani egy proxyszolgáltatást a példában bemutatott módon.

  • Válasszon az Azure-üzenetkezelési szolgáltatások közül. Információkat biztosít az üzenetkezelési és sorkezelési mechanizmusok kiválasztásáról Azure-alkalmazásokban.

  • Aszinkron üzenetalapú kommunikáció.

  • Web-Queue-Worker architektúrastílus. A web és a feldolgozó is állapot nélküli. A munkamenet-állapot tárolható egy megosztott gyorsítótárban. A hosszan futó munkákat a feldolgozó aszinkron módon végzi el. A feldolgozó aktiválható üzenetekkel az üzenetsoron, vagy futhat egy ütemezésben a kötegelt feldolgozáshoz.

A minta megvalósításakor az alábbi minták is relevánsak lehetnek:

  • Versengő felhasználókat ismertető minta. Egy szolgáltatás több példánya is futtatható lehet, amelyek mindegyike üzenetfogyasztóként viselkedik a terheléskiegyenlítő üzenetsorból. Ezzel a módszerrel beállíthatja az üzenetek szolgáltatásból való fogadásának és a szolgáltatásba küldésének sebességét.

  • Szabályozási minta. A szolgáltatás általi szabályozás megvalósításának egyszerű módja az üzenetsoralapú terheléskiegyenlítés és a szolgáltatásokra érkező összes kérés átirányítása egy üzenetsorba. A szolgáltatás olyan sebességgel dolgozza fel a kéréseket, amely biztosítja, hogy a szolgáltatás számára szükséges erőforrások ne merüljenek ki, és hogy csökkenjen az esetleges verseny mennyisége.