Podrobnosti implementace datových proudů Orleans

V této části najdete podrobný přehled implementace Orleans streamu. Popisuje koncepty a podrobnosti, které nejsou viditelné na úrovni aplikace. Pokud plánujete používat jenom streamy, nemusíte si přečtěte tento oddíl.

Terminologie:

Ve slově "Queue" se pošle jakákoli trvalá technologie úložiště, která může ingestovat události streamu a umožňuje buď vyžádat události, nebo poskytuje mechanizmus založený na nabízených oznámeních pro využívání událostí. Pro zajištění škálovatelnosti obvykle poskytují tyto technologie fronty horizontálně dělené/dělené fronty. Například fronty Azure umožňují vytvořit více front a Event Hubs mít více rozbočovačů.

Trvalé streamy

Všichni zprostředkovatelé trvalého streamu Orleans sdílejí společnou implementaci PersistentStreamProvider . Tito zprostředkovatelé obecných datových proudů musí být nakonfigurováni s konkrétní IQueueAdapterFactory technologií.

Pro účely testování máme místo čtení dat z fronty adaptéry, které generují testovací data. Následující kód ukazuje, jak nakonfigurujeme poskytovatele trvalého datového proudu pro použití našeho vlastního (generátorového) adaptéru fronty. Dělá to tak, že nakonfiguruje zprostředkovatele trvalého datového proudu pomocí funkce Factory použité k vytvoření adaptéru.

hostBuilder.AddPersistentStreams(
    StreamProviderName, GeneratorAdapterFactory.Create);

Když producent streamu vygeneruje novou položku a volání stream.OnNext() streamu, vyvolá modul runtime streamování Orleans vhodnou metodu pro IQueueAdapter poskytovatele streamu, který položku zařadí do fronty přímo do příslušné fronty.

Přijímání agentů

V případě poskytovatele trvalého streamu jsou poskytovatelé přijímání agenti. Vyžádané agenti vybírají události ze sady odolných front a doručují je do kódu aplikace v zrn, které je využívají. Jednu z nich si můžete představit jako distribuovanou "mikroslužbu", což je dělená, vysoce dostupná a pružná distribuovaná součást. Vystavované agenti se spouštějí ve stejném silu, který hostuje zrna aplikace a jsou plně spravovány modulem runtime streamování Orleans.

StreamQueueMapper a StreamQueueBalancer

Nepoužívané agenti jsou parametrizovani pomocí IStreamQueueMapper a IStreamQueueBalancer . IStreamQueueMapperPoskytuje seznam všech front a zodpovídá taky za mapování datových proudů do front. Tímto způsobem se na straně producenta trvalého datového proudu ví, do které fronty se má zpráva zařadit do fronty.

IStreamQueueBalancerVyjadřuje způsob, jakým jsou fronty vyvážené napříč Orleans sila a agenty. Cílem je přiřadit fronty agentům vyváženým způsobem, aby se zabránilo kritickým bodům a pružnosti podpory. Když se do clusteru Orleans přidá nové sila, automaticky se vyrovnávají fronty v rámci starých a nových sila. StreamQueueBalancerUmožňuje přizpůsobení tohoto procesu. Orleans má několik vestavěných StreamQueueBalancersů, které podporují různé scénáře vyrovnávání zatížení (velký a malý počet front) a různá prostředí (Azure, on-Prem, static).

Pomocí příkladu generátoru testu z výše uvedeného kódu ukazuje, jak může jedna nakonfigurovat Mapovač fronty a nástroj pro vyrovnávání zatížení fronty.

hostBuilder
    .AddPersistentStreams(StreamProviderName, GeneratorAdapterFactory.Create,
        providerConfigurator =>
        providerConfigurator.Configure<HashRingStreamQueueMapperOptions>(
            ob => ob.Configure(options => options.TotalQueueCount = 8))
      .UseDynamicClusterConfigDeploymentBalancer());

Výše uvedený kód nakonfiguruje GeneratorAdapterFactory pro použití mapovače fronty s osmi frontami a vyrovnává fronty napříč clusterem pomocí DynamicClusterConfigDeploymentBalancer .

Vydaný protokol

Každé silo spouští sadu vydaných agentů, každý Agent se vybírá z jedné fronty. Vystavení samotných agentů je implementováno pomocí interní běhové komponenty s názvem SystemTarget. SystemTargets jsou v podstatě běhová zrna, která se vztahují na souběžnost, může používat běžné zasílání zpráv v zrnitosti a jsou zjednodušená v případě zrn. Na rozdíl od zrn nejsou SystemTargets virtuální: jsou explicitně vytvořeny (modulem runtime) a nejsou transparentní. Když implementujete přijímání agentů jako SystemTargets, modul runtime streamování Orleans může spoléhat na integrované funkce Orleans a může se škálovat na velmi velký počet front, protože vytvoření nového vydávajícího agenta je levné jako při vytváření nové zrnitosti.

Každý vydaný Agent spustí pravidelný časovač, který vyžádá z fronty vyvoláním IQueueAdapterReceiver.GetQueueMessagesAsync metody. Vracené zprávy jsou umístěny do interní struktury dat pro agenty, které jsou volány IQueueCache . Všechny zprávy jsou zkontrolovány a zjištění jejího cílového datového proudu. Agent používá Pub-Sub k tomu, aby vyhledal seznam příjemců streamu, kteří se přihlásili k odběru tohoto datového proudu. Jakmile je seznam příjemců načtený, agent ho uloží místně (v mezipaměti pro publikování do mezipaměti), takže nemusí s Pub-Subem při každé zprávě konzultovat. Agent také přihlašuje k odběru oznámení o všech nových vzdaných odběratelích, kteří se přihlásí k odběru tohoto datového proudu. Tato metoda handshake mezi agentem a metodou Pub-sub garantuje sémantiku předplatného pro silné streamování: Jakmile se uživatel přihlásí ke streamu, uvidí všechny události, které byly vygenerovány po přihlášení k odběru. Kromě toho umožňuje použití StreamSequenceToken přihlášení k odběru v minulosti.

Mezipaměť fronty

IQueueCache je interní datová struktura pro agenty, která umožňuje odpojuje nové události z fronty a jejich doručování pro uživatele. Umožňuje také odpojuje doručení různým datovým proudům a různým příjemcům.

Imagine situaci, kdy jeden datový proud má 3 uživatele datového proudu a jeden z nich je pomalý. Pokud se nerozhodnete, může tento pomalý spotřebitel ovlivnit pokrok agenta, zpomalit spotřebu dalších uživatelů tohoto datového proudu a dokonce i zpomalit vyřazování a doručování událostí pro jiné streamy. Abychom tomu předešli a povolili maximální paralelismuy v agentovi, používáme IQueueCache .

IQueueCache ukládá do vyrovnávací paměti události streamu a umožňuje agentovi doručovat události každému příjemci vlastním tempem. Doručení na příjemce je implementováno pomocí interní komponenty s názvem IQueueCacheCursor , která sleduje průběh podle uživatele. Tímto způsobem každý příjemce obdrží události vlastním tempem: rychle dostanou události rychle, když se z fronty odřadí z fronty, zatímco pomalými příjemci je získají později. Po doručení zprávy všem příjemcům je možné ji odstranit z mezipaměti.

Tlakový tlak

Netlak v modulu runtime streamování Orleans se používá na dvou místech: přenesení událostí streamu z fronty do agenta a doručování událostí z agenta pro uživatele streamování.

Druhý je poskytován integrovaným mechanismem doručování zpráv Orleans. Každá událost streamování se od agenta doručuje příjemcům přes standardní zasílání zpráv Orleans po jednotlivých intervalech. To znamená, že agenti odesílají jednu událost (nebo v případě omezené velikosti dávky událostí) každému příjemci datového proudu a čekají na toto volání. Další událost nebude zahájena, dokud nebude úloha předchozí události vyřešena nebo přerušena. Tímto způsobem jsme přirozeně omezili sazbu doručení podle uživatele na jednu zprávu.

Při načítání událostí streamu z fronty do agenta poskytuje streamování Orleans nový mechanizmus pro speciální mechanismus pro natlak. Vzhledem k tomu, že agent odděluje z fronty události a doručuje je příjemcům, může se stát, že jeden pomalý spotřebitel bude mít za to, že IQueueCache se vyplní. Aby nedošlo IQueueCache k neurčité neomezenou dobu, omezujeme velikost (omezení velikosti se dá konfigurovat). Agent ale nikdy nevyvolává nedoručené události.

Místo toho, když se mezipaměť začne naplnit, agenti zpomalí vyřazení událostí z fronty. Tímto způsobem můžeme "podobu" pomalých dodacích období, a to úpravou rychlosti, kterou používáme z fronty ("zpětného zatížení") a později se vrátíte k rychlostem rychlé spotřeby. K detekci minima doručování se IQueueCache používá interní datová struktura mezipamětí, která sleduje průběh doručování událostí jednotlivým uživatelům streamů. Výsledkem je velmi reakce a přizpůsobení systému.