Versengő fogyasztók mintája

Lehetővé teheti több párhuzamos felhasználó számára, hogy feldolgozzák az ugyanazon az üzenetkezelési csatornán fogadott üzeneteket. Több egyidejű felhasználóval a rendszer egyszerre több üzenetet is feldolgozhat az átviteli sebesség optimalizálása, a méretezhetőség és a rendelkezésre állás javítása, valamint a számítási feladatok egyensúlyának javítása érdekében.

Kontextus és probléma

A felhőalkalmazások gyakran nagy számú kérést kezelnek. Az egyes kérések szinkron feldolgozása helyett az alkalmazás továbbíthatja a kéréseket egy üzenetkezelő rendszeren keresztül egy olyan fogyasztói szolgáltatásnak, amely aszinkron módon kezeli őket. Ez a stratégia segít megakadályozni, hogy a kérelmek feldolgozása blokkolja az alkalmazás üzleti logikáját.

A kérések száma az idő függvényében jelentősen változhat. A felhasználói tevékenység hirtelen növekedése vagy több bérlő összesített kérései kiszámíthatatlan számítási feladatot hozhatnak létre. Csúcsidőben előfordulhat, hogy a rendszernek másodpercenként több száz kérést kell feldolgoznia. Máskor előfordulhat, hogy a szám kicsi. Emellett a kérések kezeléséhez szükséges munka nagy mértékben változhat. Ha egyetlen fogyasztói szolgáltatás példányát használja, a kérelmek terhelhetik túl ezt a példányt. Vagy az alkalmazásüzenetek beáramlása túlterhelheti az üzenetkezelő rendszert.

Az ingadozó számítási feladat kezeléséhez a rendszer több fogyasztói szolgáltatáspéldányt is futtathat. A rendszernek azonban össze kell hangolnia ezeket a fogyasztókat, hogy minden üzenet csak egy fogyasztónak legyen kézbesítve. A rendszernek a terhelést is ki kell egyensúlyoznia a fogyasztók között, hogy egy rendszerpéldány se váljon szűk keresztmetszetté.

Megoldás

Üzenetsor használatával implementálhatja az alkalmazás és a fogyasztói szolgáltatáspéldányok közötti kommunikációs csatornát. Az alkalmazás üzenetekként küldi el a kérelmeket az üzenetsorba, a fogyasztói szolgáltatáspéldányok pedig üzeneteket fogadnak és dolgoznak fel az üzenetsorból. Ez a módszer lehetővé teszi, hogy ugyanaz a fogyasztói szolgáltatáspéldány-készlet kezelje az alkalmazás bármely példányából érkező üzeneteket. Az alábbi ábra bemutatja, hogyan osztja el az üzenetsor a szolgáltatáspéldányok között a munkát.

Diagram, amely bemutatja, hogyan osztja el az üzenetsor a feladatot a szolgáltatáspéldányok között.

Megjegyzés:

Ezeket az üzeneteket több fogyasztó is megkapja, de a versengő fogyasztók mintája eltér a Publisher-Subscriber mintától. A versengő fogyasztók mintájában egy fogyasztó kap minden egyes üzenetet feldolgozásra. A Publisher-Subscriber mintában minden fogyasztó minden üzenetet kap.

Ez a megoldás a következő előnyökkel jár:

  • Egy terhelésszintezett rendszert biztosít, amely képes kezelni az alkalmazáspéldányok kéréskötetének széles variációit. Az üzenetsor pufferként működik az alkalmazáspéldányok és a fogyasztói szolgáltatáspéldányok között. Ez a puffer minimálisra csökkentheti az alkalmazás- és szolgáltatáspéldányok rendelkezésre állására és válaszképességére gyakorolt hatást. További információ: Üzenetsor-alapú terhelésegyensúlyozási minta. Egy hosszú ideig futó feldolgozást igénylő üzenet nem akadályozza meg, hogy más fogyasztói szolgáltatáspéldányok egyidejűleg dolgozzanak fel más üzeneteket.

  • Ez növeli a megbízhatóságot. Ha egy gyártó a minta használata helyett közvetlenül kommunikál egy fogyasztóval, és nem figyeli a fogyasztót, nagy valószínűséggel elveszíti az üzeneteket, vagy nem tudja feldolgozni őket, amikor a fogyasztó meghibásodik. Ebben a mintában a rendszer nem küld üzeneteket egy adott szolgáltatáspéldánynak. A sikertelen szolgáltatáspéldányok nem tiltják le a gyártót, és bármely működő szolgáltatáspéldány feldolgozhatja az üzeneteket.

  • Nem igényel összetett koordinációt a fogyasztók, illetve a termelő és a fogyasztói példányok között. Az üzenetsor biztosítja, hogy a rendszer minden üzenetet legalább egyszer elküldjön.

  • Skálázható. Az automatikus skálázás alkalmazásakor a rendszer dinamikusan növelheti vagy csökkentheti a fogyasztói szolgáltatások példányainak számát az üzenetkötet ingadozásakor.

  • Fokozható a rugalmasság, ha az üzenetsor tranzakciós olvasási műveleteket biztosít. Ha egy fogyasztói szolgáltatáspéldány egy tranzakciós művelet részeként olvas be és dolgoz fel egy üzenetet, és nem sikerül, ez a minta biztosíthatja, hogy az üzenet visszakerüljön az üzenetsorba, hogy egy másik fogyasztói szolgáltatáspéldány feldolgozhassa azt. A folyamatos üzenethibák kockázatának csökkentése érdekében javasoljuk, hogy használjon kézbesítetlen üzenetsorokat.

Problémák és szempontok

Vegye figyelembe a következő szempontokat, amikor úgy dönt, hogy hogyan valósítja meg ezt a mintát:

  • Üzenetsorrendezés: Az a sorrend, amelyben a fogyasztói szolgáltatáspéldányok üzeneteket fogadnak, nem garantált, és nem feltétlenül jeleníti meg az üzenetek létrehozásának sorrendjét. Úgy tervezheti meg a rendszert, hogy az idempotens módon dolgozza fel az üzeneteket. Ez a kialakítás segít megszüntetni a feldolgozási sorrend függőségeit.

    Az Azure Service Bus képes az üzenetek és más sémák garantált elsőként érkezett, elsőként kiszolgált sorrendben történő megvalósítását üzenet-munkamenetek használatával.

  • Szolgáltatásrugalmassági követelmények: Ha a rendszer észleli és újraindítja a sikertelen szolgáltatáspéldányokat, előfordulhat, hogy az adott szolgáltatáspéldányok által idempotensként végrehajtott műveleteket kell implementálnia, hogy minimalizálja a hatásokat, amikor egy üzenetet többször kér le és dolgoz fel.

  • Poison message észlelése: Egy hibásan formázott üzenet vagy egy olyan feladat, amely hozzáférést igényel a nem elérhető erőforrásokhoz, szolgáltatási példány meghibásodását okozhatja. A rendszernek meg kell akadályoznia, hogy ezek az üzenetek határozatlan ideig visszatérjenek az üzenetsorba, és ehelyett máshol rögzítsék és tárolják az adataikat elemzés céljából, ha szükséges. A Service Bus automatikusan küldhet üzeneteket a kézbesítetlen levelek üzenetsorába , miután a kézbesítések száma túllépte a beállított MaxDeliveryCount küszöbértéket.

  • Eredménykezelés: Az üzenetet kezelő szolgáltatáspéldány teljesen leválasztva van az üzenetet létrehozó alkalmazáslogikától, így előfordulhat, hogy nem tudnak közvetlenül kommunikálni. Ha a szolgáltatáspéldány olyan eredményeket hoz létre, amelyeknek vissza kell lépnie az alkalmazáslogikához, ezeket az információkat olyan helyen tárolja, amelyhez mindkét összetevő hozzáférhet. Annak érdekében, hogy az alkalmazáslogika ne kérhesse le a hiányos adatokat, a rendszernek jeleznie kell a feldolgozás befejezésekor. A feldolgozó folyamat egy dedikált üzenetsoron keresztül továbbíthatja az eredményeket az alkalmazáslogikának. Az alkalmazáslogikának össze kell kötnie ezeket az eredményeket az eredeti üzenettel.

  • Üzenetkezelési rendszer skálázása: Nagy léptékű megoldás esetén a nagy üzenetmennyiség túlterhelheti az üzenetsorokat, és rendszer szűk keresztmetszetté alakíthatja. Ebben az esetben fontolja meg az üzenetkezelő rendszer particionálását, hogy adott gyártóktól érkező üzeneteket küldjön egy adott üzenetsorba, vagy terheléselosztással több üzenetsor között ossza el az üzeneteket.

  • Üzenetkezelési rendszer megbízhatósága: Használjon megbízható üzenetkezelő rendszert annak biztosítására, hogy az üzenetek ne vesszenek el, miután az alkalmazás leküldi őket. Ez a képesség elengedhetetlen ahhoz, hogy az összes üzenet legalább egyszer érkezhessen.

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

Használja ezt a mintát a következő esetekben:

  • Az alkalmazás számítási feladatai olyan feladatokra vannak felosztva, amelyek aszinkron módon futtathatók.

  • A feladatok egymástól függetlenek, és párhuzamosan futtathatók.

  • A munkamennyiség nagymértékben változó, és skálázható megoldást igényel.

  • A megoldásnak magas rendelkezésre állást kell biztosítania, és rugalmasnak kell maradnia, ha a feladat feldolgozása meghiúsul.

Ez a minta nem feltétlenül megfelelő, ha:

  • Az alkalmazás számítási feladatait nem lehet könnyen különálló tevékenységekre különválasztani, vagy nagy mértékben függ a tevékenységektől.

  • A tevékenységeknek szinkron módon kell futniuk, és az alkalmazáslogikának várnia kell az egyes tevékenységek befejezésére, mielőtt az folytatódna.

  • A feladatoknak egy adott sorrendben kell futniuk.

Megjegyzés:

Egyes üzenetkezelési rendszerek olyan munkameneteket támogatnak, amelyek lehetővé teszik a termelői csoportok üzeneteinek együttes kezelését, és biztosítják, hogy ugyanaz a fogyasztó kezelje a csoport összes üzenetét. Ezt a mechanizmust rangsorolt üzenetekkel használhatja, ha támogatja az üzenetek sorrendjének kényszerítését, és az üzeneteket egymás után kézbesíti egy gyártótól egyetlen fogyasztónak.

Munkaterhelés tervezése

Értékelje ki, hogyan használhatja a konkurens fogyasztók mintáját a számítási feladatok tervezésében az Azure Well-Architected-keretrendszer pilléreiben foglalt célok és alapelvek kezelésére. Az alábbi táblázat útmutatást nyújt arról, hogy ez a minta hogyan támogatja az egyes pillérek céljait.

Alappillé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ítják, hogy a hiba bekövetkezése után teljesen működőképes állapotba kerüljön. Ez a minta redundanciát épít ki az üzenetsor-feldolgozásban úgy, hogy replikaként kezeli a fogyasztókat, így a példányhiba nem akadályozza meg, hogy más felhasználók feldolgozhassák az üzenetsor-üzeneteket.

- RE:05 Redundancia
- Háttérfeladatok
A költségoptimalizálás a számítási feladatok megtérülésénekfenntartására és javítására összpontosít. Ez a minta segíthet a költségek optimalizálásában, mivel az üzenetsor mélysége alapján skálázható, és nullára is leskálázható, ha az üzenetsor üres. Emellett optimalizálhatja a költségeket, mert korlátozhatja az egyidejű fogyasztói példányok maximális számát.

- CO:05 Díjoptimalizálás
- CO:07 Összetevő költségei
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 minta elosztja a terhelést a fogyasztói csomópontok között a kihasználtság növelése érdekében, és a sor mélysége alapján történő dinamikus skálázás minimalizálja a túlméretezést.

- PE:05 Skálázás és particionálás
- PE:07 Kód és infrastruktúra

Ha ez a minta kompromisszumokat vezet be egy pilléren belül, vegye figyelembe őket a többi pillér céljaival szemben.

Example

Az Azure Service Bus-üzenetsorokat és Azure Functions-üzenetsorokat biztosít, amelyek együttesen közvetlenül implementálják ezt a felhőtervezési mintát. A Functions triggereken és kötéseken keresztül integrálható a Service Bus szolgáltatással. Ezzel az integrációval olyan függvényeket hozhat létre, amelyek üzenetsor-üzeneteket használnak fel a közzétevőktől. Az alkalmazások üzeneteket tesznek közzé egy sorban, és a Functions-ként implementált fogyasztók lekérhetik és kezelhetik ezeket az üzeneteket.

A rugalmasság érdekében a Service Bus-üzenetsor lehetővé teszi, hogy a fogyasztó PeekLock módot használjon, amikor egy üzenetet kér le az üzenetsorból. Ez a mód megtartja az üzenetet, de elrejti más felhasználók elől. A Functions-futtatókörnyezet üzenetet kap PeekLock módban. Ha a függvény sikeresen befejeződött, a futtatókörnyezet meghívja az üzeneten a Complete. Ha a függvény meghibásodik, előfordulhat, hogy a futtatókörnyezet meghívja Abandon , és ismét láthatóvá teszi az üzenetet, hogy egy másik felhasználó lekérhesse. Ha a függvény hosszabb ideig fut, mint a PeekLock időtúllépése, a futtatókörnyezet automatikusan megújítja a zárolást, amíg a függvény fut.

Diagram, amely a Service Bus használatával osztja el a munkát a Functions között.

A Functions automatikusan skálázza a fogyasztói példányok számát az üzenetsor mélysége és a forgalom alapján. Ez a skálázás lehetővé teszi, hogy a megoldás kezelje a munkacsúcsokat, miközben minimalizálja a költségeket az alacsony aktivitású időszakokban. Ha a Functions több példányt hoz létre, az üzenetek egymástól függetlenül történő lekérésével és feldolgozásával versenyeznek. További információkért lásd a következőket: Service Bus-üzenetsorok, témakörök és előfizetések, valamint a Functions Service Bus eseményindítója.

További információ arról, hogy miként küldhet üzeneteket a Service Bus-üzenetsorba a .NET-hez készült Service Bus-ügyfélkódtár használatával, tekintse meg a közzétett példákat.

Következő lépések

  • Válasszon egy üzenetkezelési szolgáltatást az Azure-ban: Megtudhatja, hogy a különböző Azure-üzenetkezelési szolgáltatások, például a Service Bus, az Azure Storage-üzenetsorok, az Azure Event Hubs és az Azure Event Grid hogyan támogatják az aszinkron kommunikációs mintákat, és hogyan választhatja ki a forgatókönyvéhez megfelelő szolgáltatás- és üzenetkezelési modellt.

  • Ajánlott automatikus skálázási eljárások: Megtudhatja, hogyan tervezhet olyan megoldásokat, amelyek számítási feladat alapján skálázják fel a fogyasztói példányokat, például az üzenetsor hosszát vagy az üzenetek átviteli sebességét, hogy kezelni tudja a csúcsterhelést és szabályozhassa a költségeket az alacsony tevékenységi időszakokban.

  • Számítási erőforrás-konszolidációs minta: Előfordulhat, hogy egyetlen folyamatba egyesítheti egy fogyasztói szolgáltatás több példányát a költségek és a felügyeleti többletterhelés csökkentése érdekében. A számítási erőforrás-konszolidációs minta ennek a megközelítésnek az előnyeit és kompromisszumoit ismerteti.

  • Üzenetsor-alapú terheléselegyenlítési minta: Az üzenetsorok rugalmasságot adhatnak a rendszerhez. A rugalmasság lehetővé teszi, hogy a szolgáltatáspéldányok az alkalmazáspéldányoktól érkező kérések széles forgalmú mennyiségét kezeljék. Az üzenetküldési sor pufferként működik, amely kiegyenlíti a terhelést. Az üzenetsor-alapú terheléskiegyenlítési minta részletesebben is ismerteti ezt a forgatókönyvet.