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 a beérkezési sorrendjükben 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 ezeknek az üzeneteknek a sorrendben történő feldolgozása nem egyszerű, mert 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 versengő fogyasztók mintával.

Egy rendeléskövetési rendszer például kap egy rendeléseket és az adott rendelésekre vonatkozó műveleteket tartalmazó főkönyvet. Ezek a műveletek lehetnek például egy rendelés létrehozása, egy tranzakció hozzáadása a rendeléshez, egy korábbi tranzakció módosítása vagy egy rendelés törlése. Ebben a rendszerben a műveleteket első lépésben (FIFO) 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 interleaved.

Megoldás

A kapcsolódó üzeneteket a várólistán belüli kategóriákba küldi, és zárolja az üzenetsor-figyelőket, és csak egy kategóriából, egyszerre egy üzenetből húzza le őket.

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

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

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

Egybefűző üzeneteket ábrázoló 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 melyik tulajdonságára lehet vertikálisan felskálázni? A rendeléskövetési forgatókönyvben ez a tulajdonság a rendelésazonosító.
  • Átmenő. 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 idő szerint, majd elküldhet egy köteget feldolgozásra?
  • Szolgáltatásképességek. Az üzenetbusz kiválasztása lehetővé teszi az üzenetek egyszeri feldolgozását egy üzenetsoron vagy egy üzenetsor kategóriáján belül?
  • Evolvability. Hogyan fog új üzenetkategóriát hozzáadni a rendszerhez? Tegyük fel például, hogy a fent leírt főkönyvrendszer egy adott ügyfél. Ha új ügyfelet kell előkészítenie, rendelkezhet olyan főkönyvi feldolgozók készletével, amelyek ügyfél-azonosítónként osztják el a munkát?
  • Előfordulhat, hogy a fogyasztók az üzenetek küldésekor változó hálózati késés miatt nem megfelelően kapnak üzenetet. Fontolja meg a sorszámok használatát a sorrend ellenőrzéséhez. A tranzakció utolsó üzenetében egy speciális "sorozatvég" jelző is szerepelhet. Az olyan streamfeldolgozási technológiák, mint a Spark vagy az Azure Stream Analytics, képesek az üzeneteket egy időkereten belül sorrendben feldolgozni.

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

Használja ezt a mintát, ha:

  • Vannak olyan üzenetei, amelyek sorrendben érkeznek, és azokat ugyanabban a sorrendben kell feldolgozni.
  • Az érkező üzeneteket úgy lehet vagy 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 magas á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.

Példa

Az Azure-ban ez a minta 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ővel, vagy Azure Functions 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 fogyasztók az egyes kategóriákat párhuzamosan dolgozzák fel, de a FIFO-t a kategóriában.

A párkány processzorventilátor úgy irányítja ki az üzeneteket, hogy törli az egyes üzenetek tartalmát az első üzenetsorból:

Szekvenciális konvojmintát ábrázoló ábra egy főkönyvi üzenetsorsal

A főkönyv-feldolgozó gondoskodik az alábbiakról:

  1. Egyszerre csak egy tranzakciót kell végigsétálni a főkönyvben.
  2. Az üzenet munkamenet-azonosítójának beállítása a rendelésazonosítónak megfelelően.
  3. Az egyes főkönyvi tranzakciók elküldése egy másodlagos üzenetsorba, amelynek munkamenet-azonosítója a rendelésazonosítóra van állítva.

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

A skálázhatóságot figyelembe véve 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ával is kicsúszhatnak.

Következő lépések

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