Szekvenciális konvojminta

Azure Functions
Azure Service Bus

A kapcsolódó üzeneteket meghatározott sorrendben dolgozhatja fel, más üzenetcsoportok feldolgozásának akadályozása nélkül.

Kontextus és probléma

Az alkalmazásoknak gyakran az érkezésük sorrendjében kell feldolgozniuk az üzenetek sorozatát, miközben a megnövekedett terhelés kezelése érdekében továbbra is képesek a vertikális felskálázásra. Az elosztott architektúrában ezek az üzenetek feldolgozása nem egyszerű, mivel a feldolgozók egymástól függetlenül méretezhetők, és gyakran egymástól függetlenül is lekérhetik az üzeneteket egy konkurens fogyasztói minta használatával.

A rendeléskövető rendszer például kap egy rendeléseket tartalmazó főkönyvet, valamint az adott rendelésekre vonatkozó műveleteket. Ezek a műveletek lehetnek például rendelés létrehozása, tranzakció hozzáadása a rendeléshez, egy korábbi tranzakció módosítása vagy rendelés törlése. Ebben a rendszerben a műveleteket első előtti (FIFO) módon kell végrehajtani, de csak a megrendelés szintjén. A kezdeti üzenetsor azonban számos rendelés tranzakcióit tartalmazó főkönyvet kap, amely lehet, hogy interleaved.

Megoldás

A kapcsolódó üzenetek leküldése a sorbanállási rendszeren belüli kategóriákba, és az üzenetsor-figyelők zárolva vannak, és egyszerre csak egy kategóriából, egy üzenetből húzzák le őket.

Így néz ki az általános szekvenciális konvojminta:

Szekvenciális konvojmintát ábrázoló diagram

Az üzenetsorban a különböző kategóriákhoz tartozó üzenetek egymásba lehetnek osztva, ahogy az alábbi ábrán látható:

A kovetkezett üzeneteket bemutató diagram

Problémák és megfontolandó szempontok

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

  • Kategória/méretezési egység. A bejövő üzenetek milyen tulajdonságával skálázhatja fel a skálázást? A rendeléskövetési forgatókönyvben ez a tulajdonság a rendelésazonosító.
  • Átviteli sebesség. Mi a célüzenet átviteli sebessége? Ha nagyon magas, előfordulhat, hogy újra kell gondolnia a FIFO követelményeit. Kényszeríthet például egy kezdő/záró üzenetet, rendezheti az idő szerint, majd elküldhet egy köteget feldolgozásra?
  • Szolgáltatásképességek. Lehetővé teszi az üzenetsín kiválasztása az üzenetsoron vagy az üzenetsor kategóriáján belüli üzenetek egyszeri feldolgozását?
  • Evolvability. Hogyan adhat hozzá új üzenetkategóriát a rendszerhez? Tegyük fel például, hogy a fent leírt főkönyvrendszer egy adott ügyfél. Ha új ügyfelet szeretne előkészíteni, rendelkezhet olyan főkönyvfeldolgozók készletével, amelyek ügyfél-azonosítónként terjesztik a munkát?
  • Előfordulhat, hogy a felhasználók az üzenetek küldésekor változó hálózati késés miatt nem megfelelő sorrendben kapják meg az üzeneteket. Fontolja meg a sorszámok használatát a rendezés ellenőrzéséhez. Egy tranzakció utolsó üzenetében egy speciális "a sorozat vége" jelző is szerepelhet. A streamfeldolgozási technológiák, például a Spark vagy az Azure Stream Analytics egy időkereten belül képesek az üzenetek feldolgozására.

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

Használja ezt a mintát, ha:

  • Vannak olyan üzenetei, amelyek sorrendben érkeznek, és ugyanabban a sorrendben kell feldolgozni.
  • A beérkező üzeneteket úgy lehet "kategorizálni", hogy a kategória a rendszer méretezési egységévé váljon.

Ez a minta nem feltétlenül alkalmas a következőkre:

  • Rendkívül nagy átviteli sebességű forgatókönyvek (több millió üzenet/perc vagy másodperc), mivel a FIFO-követelmény korlátozza a rendszer által elvégezhető skálázást.

Számítási feladatok tervezése

Az építészeknek értékelniük kell, hogyan használható a szekvenciális konvojminta 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. Ez a minta kiküszöbölheti a nehezen elhárítható versenyfeltételeket, a vitatott üzenetkezelést vagy a helytelenül rendezett üzenetek kezelésére vonatkozó egyéb kerülő megoldásokat, amelyek hibás működéshez vezethetnek.

- RE:02 Kritikus folyamatok
- RE:07 Háttérfeladatok

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

Az Azure-ban ez a minta az Azure Service Bus-üzenet munkamenetek használatával valósítható meg. A felhasználók számára használhatja a Logic Appst a Service Bus peek-lock összekötőjével , vagy az Azure Functionst a Service Bus-eseményindítóval.

Az előző rendeléskövetési példában dolgozza fel az egyes főkönyvi üzeneteket a kapott rendelésben, és küldje el az egyes tranzakciókat egy másik üzenetsorba, ahol a kategória a rendelésazonosítóra van állítva. Ebben a forgatókönyvben a tranzakciók soha nem terjednek ki több megrendelésre, így a felhasználók az egyes kategóriákat párhuzamosan dolgozzák fel, de a FIFO-t a kategórián belül.

A párkány processzorventilátora az első üzenetsor egyes üzeneteinek tartalmát a kötegelés megszüntetésével állítja elő:

Szekvenciális konvojmintát ábrázoló diagram egy főkönyv-üzenetsorsal

A főkönyv-feldolgozó gondoskodik a következőről:

  1. Egyszerre egy tranzakciót hajthat végig a főkönyvben.
  2. Az üzenet munkamenet-azonosítójának beállítása a rendelésazonosítónak megfelelően.
  3. Minden tranzakció elküldése egy másodlagos üzenetsorba a rendelésazonosítóra beállított munkamenet-azonosítóval.

A felhasználók figyelik a másodlagos üzenetsort, ahol az üzenetsorból sorrendbe rendezve dolgozzák fel az összes, egyező sorrendű azonosítóval rendelkező üzenetet. A fogyasztók peek-lock módot használnak.

A méretezhetőség szempontjából a főkönyv-üzenetsor elsődleges szűk keresztmetszet. A főkönyvbe feladott különböző tranzakciók ugyanarra a rendelésazonosítóra hivatkozhatnak. Az üzenetek azonban a főkönyv után a kiszolgáló nélküli környezetben lévő rendelések számához is ki tudnak omlani.

Következő lépések

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