Partícióterhelés egyensúlya az alkalmazás több példánya között

Az eseményfeldolgozó alkalmazás méretezéséhez az alkalmazás több példányát is futtathatja, és a terhelés kiegyensúlyozott lehet egymás között. A régebbi és elavult verziókban lehetővé tette, EventProcessorHost hogy az események fogadásakor kiegyensúlyozza a terhelést a program több példánya és az ellenőrzőpont-események között. Az újabb verziókban (5.0-tól) az EventProcessorClient (.NET és Java) vagy az EventHubConsumerClient (Python és JavaScript) ugyanezt teszi. A fejlesztési modell egyszerűbb lesz események használatával. Az eseménykezelő regisztrálásával előfizethet az önt érdeklő eseményekre. Ha az ügyfélkódtár régi verzióját használja, tekintse meg a következő áttelepítési útmutatókat: .NET, Java, Python és JavaScript.

Ez a cikk egy példaforgatókönyvet ismertet, amely az ügyfélalkalmazások több példányát használja események eseményközpontból való olvasására. Emellett részletesen ismerteti az eseményfeldolgozó ügyfél funkcióit, így egyszerre több partícióról is fogadhat eseményeket, és terheléselosztást végezhet az ugyanazon eseményközpontot és fogyasztói csoportot használó többi felhasználóval.

Feljegyzés

Az Event Hubs méretezésének kulcsa a particionált felhasználók ötlete. A versengő fogyasztói mintával ellentétben a particionált fogyasztói minta nagy skálázást tesz lehetővé a versengés szűk keresztmetszetének megszüntetésével és a végpontok közötti párhuzamosság megkönnyítésével.

Példaforgatókönyv

Példaforgatókönyvként tekintsünk egy otthoni biztonsági vállalatra, amely 100 000 lakást figyel. Percenként adatokat kap különböző érzékelőktől, például mozgásérzékelőtől, ajtó/ablak nyitott érzékelőtől, üvegtörésérzékelőtől és így tovább, minden otthonba telepítve. A vállalat egy webhelyet biztosít a lakosok számára, hogy közel valós időben monitorozzák otthonuk tevékenységét.

Minden érzékelő adatokat küld egy eseményközpontba. Az eseményközpont 16 partícióval van konfigurálva. A használat során olyan mechanizmusra van szüksége, amely képes elolvasni ezeket az eseményeket, összesíteni őket (szűrés, összesítés stb.), és az összesítést egy tárolóblobba helyezni, amely ezután egy felhasználóbarát weblapra lesz kivetítve.

Fogyasztói alkalmazás

Ha elosztott környezetben tervez fogyasztót, a forgatókönyvnek a következő követelményeket kell kezelnie:

  1. Skálázás: Több felhasználó létrehozása, és minden egyes fogyasztó átveszi az olvasás tulajdonjogát néhány Event Hubs-partícióból.
  2. Terheléselosztás: A felhasználók dinamikus növelése vagy csökkentése. Ha például minden otthonhoz új érzékelőtípust (például szén-monoxid-érzékelőt) adnak hozzá, az események száma nő. Ebben az esetben az operátor (ember) növeli a fogyasztói példányok számát. Ezután a felhasználói készlet újra kiegyensúlyozhatja a saját partíciók számát, hogy megoszthassa a terhelést az újonnan hozzáadott felhasználókkal.
  3. Zökkenőmentes folytatás hibák esetén: Ha egy fogyasztó (A fogyasztó) meghibásodik (például a fogyasztót üzemeltető virtuális gép hirtelen összeomlik), akkor más felhasználók is felvehetik az A fogyasztó tulajdonában lévő partíciókat, és folytathatják a műveletet. Emellett a folytatási pontnak, vagyis az ellenőrzőpontnak vagy az eltolásnak pontosan azon a ponton kell lennie, ahol az A fogyasztó meghiúsult, vagy kissé előtte.
  4. Események felhasználása: Bár az előző három pont a fogyasztó kezelésével foglalkozik, az események felhasználásához és a vele kapcsolatos hasznos műveletekhez kódnak kell lennie. Például összesítheti és feltöltheti a Blob Storage-ba.

Eseményfeldolgozó vagy fogyasztói ügyfél

A követelményeknek való megfeleléshez nem kell saját megoldást létrehoznia. Az Azure Event Hubs SDK-k biztosítják ezt a funkciót. A .NET- vagy Java SDK-kban eseményfeldolgozó ügyfelet (EventProcessorClient), Python- és JavaScript-SDK-kban pedig EventHubConsumerClient. Az SDK régi verziójában az eseményfeldolgozó állomás (EventProcessorHost) támogatta ezeket a funkciókat.

A legtöbb éles forgatókönyv esetében azt javasoljuk, hogy az eseményfeldolgozó ügyfelet használja az események olvasásához és feldolgozásához. A processzorügyfél célja, hogy hatékony élményt nyújtson az események feldolgozásához az eseményközpont minden partícióján, teljesítménnyel és hibatűrő módon, miközben lehetővé teszi a folyamat előrehaladásának ellenőrzését. Az eseményfeldolgozó ügyfelek együttműködhetnek egy adott eseményközpont fogyasztói csoportjának kontextusában. Az ügyfelek automatikusan kezelik a munka elosztását és kiegyensúlyozását, amint a példányok elérhetővé válnak vagy elérhetetlenné válnak a csoport számára.

Partíció tulajdonjoga

Az eseményfeldolgozó példányok általában egy vagy több partícióból származó eseményeket birtokolnak és dolgoznak fel. A partíciók tulajdonjoga egyenlően oszlik el az eseményközponthoz és a fogyasztói csoport kombinációhoz társított összes aktív eseményfeldolgozó példány között.

Minden eseményfeldolgozó egyedi azonosítót és jogcím tulajdonjogot kap a partíciókhoz, ha hozzáad vagy frissít egy bejegyzést egy ellenőrzőpont-tárolóban. Az eseményfeldolgozó példányok rendszeres időközönként kommunikálnak ezzel a tárolóval a saját feldolgozási állapotának frissítéséhez és az egyéb aktív példányok megismeréséhez. Ezek az adatok ezután az aktív processzorok terhelésének kiegyenlítésére szolgálnak. Az új példányok csatlakozhatnak a feldolgozási készlethez a felskálázáshoz. Ha a példányok leállnak, akár hibák, akár leskálázás miatt, a partíció tulajdonjoga kecsesen átkerül más aktív processzorokba.

Az ellenőrzőpont-tároló partíció tulajdonjogi rekordjai nyomon követik az Event Hubs-névteret, az eseményközpont nevét, a fogyasztói csoportot, az eseményfeldolgozó azonosítóját (más néven tulajdonost), a partícióazonosítót és az utolsó módosítás időpontját.

Event Hubs-névtér Eseményközpont neve Fogyasztói csoport Tulajdonos Partícióazonosító Utolsó módosítás időpontja
mynamespace.servicebus.windows.net myeventhub myconsumergroup 3be3f9d3-9d9e-4c50-9491-85ece8334ff6 0 2020-01-15T01:22:15
mynamespace.servicebus.windows.net myeventhub myconsumergroup f5cc5176-ce96-4bb4-bbaa-a0e3a9054ecf 0 2020-01-15T01:22:17
mynamespace.servicebus.windows.net myeventhub myconsumergroup 72b980e9-2efc-4ca7-ab1b-ffd7bece8472 2 2020-01-15T01:22:10
:
:
mynamespace.servicebus.windows.net myeventhub myconsumergroup 844bd8fb-1f3a-4580-984d-6324f9e208af 15 2020-01-15T01:22:00

Minden eseményfeldolgozó-példány tulajdonjogot szerez egy partícióhoz, és megkezdi a partíció feldolgozását az utolsó ismert ellenőrzőpontról. Ha egy processzor meghibásodik (a virtuális gép leáll), akkor a többi példány a legutóbbi módosítási időpontot tekintve észleli. Más példányok megpróbálják megkapni az inaktív példány által korábban birtokolt partíciók tulajdonjogát. Az ellenőrzőpont-tároló garantálja, hogy csak az egyik példánynak sikerül tulajdonjogot igényelnie egy partícióhoz. Tehát egy adott időpontban legfeljebb egy processzor fogadja az eseményeket egy partícióról.

Üzenetek fogadása

Eseményfeldolgozó létrehozásakor meg kell adnia az eseményeket és hibákat feldolgozó függvényeket. Az eseményeket feldolgozó függvény minden hívása egyetlen eseményt biztosít egy adott partícióról. Az Ön felelőssége, hogy kezelje ezt az eseményt. Ha meg szeretné győződni arról, hogy a fogyasztó legalább egyszer feldolgozza az összes üzenetet, újrapróbálkozási logikával kell írnia egy saját kódot. De legyen óvatos a mérgezett üzenetek miatt.

Javasoljuk, hogy viszonylag gyorsan végezze el a műveleteket. Vagyis a lehető legkevesebb feldolgozást végezze el. Ha a tárolóba kell írnia, és útválasztást kell végeznie, jobb, ha két fogyasztói csoportot használ, és két eseményfeldolgozóval rendelkezik.

Checkpoint

A checkpointing egy folyamat, amellyel egy eseményfeldolgozó megjelöli vagy véglegesíti az utolsó sikeresen feldolgozott esemény pozícióját egy partíción belül. Az ellenőrzőpont megjelölése általában azon a függvényen belül történik, amely feldolgozza az eseményeket, és partíciónként történik egy fogyasztói csoportban.

Ha egy eseményfeldolgozó megszakítja a kapcsolatot egy partícióval, egy másik példány folytathatja a partíció feldolgozását azon az ellenőrzőponton, amelyet korábban a partíció utolsó feldolgozója véglegesített az adott fogyasztói csoportban. Amikor a processzor csatlakozik, az eltolást átadja az eseményközpontnak, és megadja, hogy hol kezdjen olvasást. Ily módon az ellenőrzőpontokkal az eseményeket "készként" jelölheti meg az alsóbb rétegbeli alkalmazásokban, és rugalmasságot biztosíthat az eseményfeldolgozó leállásakor. Az ellenőrzőpontozási folyamat alacsonyabb eltolásának megadásával visszatérhet a régebbi adatokhoz.

Amikor az ellenőrzőpontot egy esemény feldolgozottként való megjelöléséhez hajtja végre, a rendszer hozzáad vagy frissít egy bejegyzést az ellenőrzőpont-tárolóban az esemény eltolásával és sorszámával. A felhasználóknak el kell dönteniük az ellenőrzőpont frissítésének gyakoriságát. Az egyes sikeresen feldolgozott események utáni frissítés teljesítmény- és költségvonzatokkal járhat, mivel írási műveletet indít el az alapul szolgáló ellenőrzőpont-tárolóban. Emellett minden egyes esemény ellenőrzőpontozása egy üzenetsoros üzenetkezelési mintát jelez, amelyhez a Service Bus-üzenetsor jobb megoldás lehet, mint egy eseményközpont. Az Event Hubs mögött az az ötlet áll, hogy nagy léptékben "legalább egyszer" kézbesítést kap. Az alsóbb rétegbeli rendszerek idempotenssé tételével könnyen helyreállítható az olyan hibák vagy újraindítások, amelyek ugyanazon események többszöri fogadását eredményezik.

Kövesse az alábbi javaslatokat az Azure Blob Storage ellenőrzőpont-tárolóként való használatakor:

  • Minden fogyasztói csoporthoz használjon külön tárolót. Használhatja ugyanazt a tárfiókot, de csoportonként egy tárolót.
  • Ne használja a tárolót semmi máshoz, és ne használja a tárfiókot semmi máshoz.
  • A tárfióknak ugyanabban a régióban kell lennie, amelyben az üzembe helyezett alkalmazás található. Ha az alkalmazás helyszíni, próbálja meg kiválasztani a lehető legközelebbi régiót.

Az Azure Portal Tárfiók lapján, a Blob szolgáltatás szakaszában győződjön meg arról, hogy a következő beállítások le vannak tiltva.

  • Hierarchikus névtér
  • Blob áltörlése
  • Verziókezelés

Szálbiztonság és processzorpéldányok

Alapértelmezés szerint az eseményeket feldolgozó függvényt szekvenciálisan hívjuk meg egy adott partícióhoz. Az ezt követő események és a függvény hívásai ugyanabból a partíciósorból a színfalak mögött, ahogy az eseménypumpa továbbra is fut a háttérben más szálakon. A különböző partíciók eseményei egyidejűleg feldolgozhatók, és a partíciók között elérhető megosztott állapotokat szinkronizálni kell.

Következő lépések

Tekintse meg a következő rövid útmutatót: