Skala ditt bearbetningsprogram
Om du vill skala ditt händelsebearbetningsprogram kan du köra flera instanser av programmet och låta det balansera belastningen sinsemellan. I de äldre versionerna tillät EventProcessorHost dig att balansera belastningen mellan flera instanser av ditt program och göra kontrollpunkter när du tog emot händelser. I de nyare versionerna (5.0 och senare) ger EventProcessorClient (.NET och Java) eller EventHubConsumerClient (Python och JavaScript) dig möjlighet att göra samma sak.
Obs
Nyckeln till skalning för Event Hubs är idén med partitionerade konsumenter. Till skillnad från det konkurrerande konsumentmönstret möjliggör det partitionerade konsumentmönstret hög skala genom att ta bort konkurrensflaskhalsen och underlätta parallellitet från slutpunkt till slutpunkt.
Exempelscenario
Som ett exempel kan du överväga ett hemsäkerhetsföretag som övervakar 100 000 hem. Varje minut hämtar den data från olika sensorer, till exempel en rörelsedetektor, öppen sensor för dörr/fönster, glasbrytsdetektor och så vidare, installerade i varje hem. Företaget tillhandahåller en webbplats för boende att övervaka aktiviteten i sitt hem i nära realtid.
Varje sensor skickar data till en händelsehubb. Händelsehubben är konfigurerad med 16 partitioner. I den förbrukande änden behöver du en mekanism som kan läsa dessa händelser, konsolidera dem och dumpa aggregeringen till en lagringsblob, som sedan projiceras till en användarvänlig webbsida.
När du utformar konsumenten i en distribuerad miljö måste scenariot hantera följande krav:
- Skala: Skapa flera konsumenter, där varje konsument övertar ansvaret för läsning från några Event Hubs-partitioner.
- Belastningsutjämning: Öka eller minska användarna dynamiskt. När till exempel en ny sensortyp (till exempel en kolmonoxiddetektor) läggs till i varje hem ökar antalet händelser. I så fall ökar operatören (en människa) antalet konsumenter. Sedan kan poolen med konsumenter balansera om antalet partitioner som de äger för att dela belastningen med de nyligen tillagda konsumenterna.
- Sömlös återuppta vid fel: Om en konsument (konsument A) misslyckas (till exempel den virtuella datorn som är värd för konsumenten plötsligt kraschar), kan andra konsumenter hämta partitionerna som ägs av konsument A och fortsätta. Fortsättningspunkten, som kallas för en kontrollpunkt eller förskjutning, bör också ligga vid den exakta tidpunkt då konsument A misslyckades eller något före det.
- Bearbeta händelser: Även om de föregående tre punkterna handlar om hantering av konsumenten måste det finnas kod för att bearbeta händelserna och göra något användbart av dem. Du kan till exempel aggregera den och ladda upp den till bloblagring.
Händelseprocessor eller klientprogram för konsumenter
Du behöver inte skapa en egen lösning för att uppfylla dessa krav. Azure Event Hubs SDK:er tillhandahåller den här funktionen. I .NET- eller Java-SDK:er använder du en händelseprocessorklient (EventProcessorClient
), och i Python- och JavaScript-SDK:er använder du EventHubConsumerClient
.
I de flesta produktionsscenarier rekommenderar vi att du använder händelseprocessorklienten för att läsa och bearbeta händelser. Händelseprocessorklienter kan samarbeta inom ramen för en konsumentgrupp för en viss händelsehubb. Klienter hanterar automatiskt distribution och balansering av arbete när instanser blir tillgängliga eller otillgängliga för gruppen.
Spårning av partitionsägarskap
En händelseprocessorinstans äger och bearbetar vanligtvis händelser från en eller flera partitioner. Ägarskapet för partitioner fördelas jämnt mellan alla aktiva händelseprocessorinstanser som är associerade med en kombination av händelsehubbar och konsumentgrupper.
Varje händelseprocessor får en unik identifierare och tar ägarskap över partitioner genom att lägga till eller uppdatera en post i en kontrollpunktbutik. Alla händelseprocessorinstanser kommunicerar med det här arkivet regelbundet för att uppdatera sitt eget bearbetningstillstånd och för att lära sig mer om andra aktiva instanser. Dessa data används sedan för att balansera belastningen mellan de aktiva processorerna.
Ta emot meddelanden
När du skapar en händelseprocessor anger du de funktioner som bearbetar händelser och fel. Varje anrop till funktionen som bearbetar händelser levererar en enskild händelse från en specifik partition. Det är ditt ansvar att hantera den här händelsen. Om du vill se till att konsumenten bearbetar varje meddelande minst en gång måste du skriva din egen kod med logik för återförsök. Men var försiktig med förgiftade meddelanden.
Vi rekommenderar att du gör saker relativt snabbt. Det vill: gör så lite bearbetning som möjligt. Om du behöver skriva till lagring och utföra viss routning är det bättre att använda två konsumentgrupper och ha två händelseprocessorer.
Kontrollpunkter
Kontrollpunktering är en process där en händelseprocessor markerar eller bestämmer positionen för den senast framgångsrikt bearbetade händelsen i en partition. En kontrollpunkt markeras vanligtvis i funktionen som bearbetar händelserna och sker per partition i en konsumentgrupp.
Om en händelseprocessor kopplas från en partition kan en annan instans återuppta bearbetningen av partitionen vid den kontrollpunkt som tidigare fastställdes av den siste processorn för partitionen i konsumentgruppen. När processorn ansluter skickas förskjutningen till händelsehubben för att ange startpunkten för läsning. På så sätt kan du använda kontrollpunkter för att både markera händelser som "slutförda" av underordnade program och för att ge återhämtning när en händelseprocessor slutar fungera. Det går att återgå till äldre data genom att ange en lägre förskjutning från den här kontrollpunktsprocessen.
Trådsäkerhet och processorinstanser
Som standard anropas funktionen som bearbetar händelserna sekventiellt för en viss partition. Efterföljande händelser och anrop till den här funktionen från samma partitionskö upp bakom kulisserna när händelsepumpen fortsätter att köras i bakgrunden på andra trådar. Händelser från olika partitioner kan bearbetas samtidigt och alla delade tillstånd som nås mellan partitioner måste synkroniseras.