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:
Az üzenetsorban a különböző kategóriákhoz tartozó üzenetek egymásba lehetnek osztva, ahogy az alábbi ábrán látható:
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ő:
A főkönyv-feldolgozó gondoskodik a következőről:
- Egyszerre egy tranzakciót hajthat végig a főkönyvben.
- Az üzenet munkamenet-azonosítójának beállítása a rendelésazonosítónak megfelelően.
- 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: