Bezstavová pracovní zrna

Modul runtime ve výchozím nastavení Orleans nevytáčí více než jednu aktivaci agregace v rámci clusteru. Jedná se o nejtuitivnější výraz modelu virtuálního objektu actor s každým agregačním intervalem odpovídajícím entitě s jedinečným typem nebo identitou. Existují však také případy, kdy aplikace potřebuje provádět funkční bezstavové operace, které nejsou svázané s konkrétní entitou v systému. Pokud například klient odesílá požadavky s komprimovanými datovými částmi, které je potřeba dekompresi před tím, než je možné je směrovat do cílového agregačního intervalu pro zpracování, není taková logika dekomprimace nebo směrování svázaná s konkrétní entitou v aplikaci a může snadno škálovat kapacitu.

StatelessWorkerAttribute Při použití na třídu zrnitosti označuje Orleans modul runtime, že zrnka této třídy by měla být považována za bezstavová pracovní zrnka. Bezstavová zrnka pracovních procesů mají následující vlastnosti, které jejich provádění velmi liší od normálních tříd zrn.

  1. Modul Orleans runtime může a vytvoří několik aktivací bezstavového pracovního procesu na různých silech clusteru.
  2. Požadavky na bezstavová zrnka pracovních procesů se provádějí místně, pokud je silo kompatibilní, a proto se neúčtují náklady na síť ani serializaci. Pokud místní silo není kompatibilní, požadavky se předávají do kompatibilního sila.
  3. Modul Orleans runtime automaticky vytvoří další aktivace bezstavového pracovního intervalu, pokud už jsou zaneprázdněné. Maximální počet aktivací bezstavového pracovního procesu, které modul runtime vytvoří na silo, je ve výchozím nastavení omezený počtem jader procesoru na počítači, pokud není výslovně určen volitelný maxLocalWorkers argument.
  4. Z důvodu 2 a 3 nejsou aktivace bezstavového agregace pracovních procesů zvlášť adresovatelné. Dva následné požadavky na bezstavový pracovní interval mohou být zpracovány různými aktivacemi.

Bezstavová zrnka pracovních procesů poskytují jednoduchý způsob, jak vytvořit automaticky spravovaný fond aktivací zrnitosti, který automaticky vertikálně navyšuje a snižuje kapacitu na základě skutečného zatížení. Modul runtime vždy vyhledává dostupné aktivace bezstavového pracovního procesu ve stejném pořadí. Z tohoto důvodu vždy odesílá požadavky na první nečinnou místní aktivaci, kterou může najít a dostane se k poslední aktivaci pouze v případě, že všechny předchozí aktivace jsou zaneprázdněné. Pokud jsou všechny aktivace zaneprázdněné a limit aktivace nebyl dosažen, vytvoří na konci seznamu další aktivaci a odešle do ní požadavek. To znamená, že když se zvýší rychlost požadavků na bezstavový agregační interval pracovních procesů a všechny stávající aktivace jsou momentálně zaneprázdněné, modul runtime rozšíří fond svých aktivací až do limitu. Naopak, když zatížení klesne a lze ho zpracovat menším počtem aktivací bezstavového pracovního intervalu, aktivace na konci seznamu nebudou dostávat žádosti o odeslání. Stanou se nečinné a nakonec se deaktivují standardním procesem shromažďování aktivace. Fond aktivací se proto nakonec zmenší tak, aby odpovídal zatížení.

Následující příklad definuje třídu MyStatelessWorkerGrain bezstavového pracovního intervalu s výchozím limitem maximálního počtu aktivačních čísel.

[StatelessWorker]
public class MyStatelessWorkerGrain : Grain, IMyStatelessWorkerGrain
{
    // ...
}

Volání bezstavového pracovního intervalu je stejné jako jakékoli jiné agregační. Jediným rozdílem je, že ve většině případů se používá jedno ID agregačního intervalu, například 0Guid.Empty. Pokud máte více bezstavových fondů agregačních intervalů, je žádoucí použít několik ID jednotlivých intervalů.

var worker = GrainFactory.GetGrain<IMyStatelessWorkerGrain>(0);
await worker.Process(args);

Tato třída definuje bezstavovou třídu zrnitého pracovního procesu, která nemá více než jednu aktivaci na silo.

[StatelessWorker(1)] // max 1 activation per silo
public class MyLonelyWorkerGrain : ILonelyWorkerGrain
{
    //...
}

Všimněte si, že StatelessWorkerAttribute nemění reentrancy cílové třídy agregace. Stejně jako jakékoli jiné zrno jsou bezstavová pracovní zrna ve výchozím nastavení neopakována. Je možné je explicitně vytvořit znovu přidáním ReentrantAttribute třídy zrnitosti.

Stav

Bezstavová část "bezstavového pracovního procesu" neznamená, že bezstavový pracovní proces nemůže mít stav a je omezen pouze na provádění funkčních operací. Stejně jako jakékoli jiné zrnitost může bezstavový pracovní interval načíst a udržovat v paměti libovolný stav, který potřebuje. Je to jen proto, že na stejném a jiném sila clusteru lze vytvořit více aktivací bezstavového pracovního intervalu, neexistuje žádný snadný mechanismus pro koordinaci stavu uchovávaného různými aktivacemi.

Několik užitečných vzorů zahrnuje bezstavové pracovní proces držící stav.

Horizontální navýšení kapacity položek horké mezipaměti

U položek horké mezipaměti, u nichž dochází k vysoké propustnosti, je uchovávání každé takové položky v bezstavovém pracovním intervalu:

  1. Automatické horizontální navýšení kapacity v rámci sil a napříč všemi silami v clusteru a;
  2. Data jsou vždy místně dostupná na silu, které obdržely požadavek klienta prostřednictvím své brány klienta, aby bylo možné na požadavky odpovědět bez dalšího segmentu směrování sítě do jiného sila.

Omezení agregace stylu

V některých scénářích musí aplikace počítat určité metriky napříč všemi zrnky konkrétního typu v clusteru a pravidelně hlásit agregace. Příklady hlásí několik hráčů na mapu hry, průměrnou dobu trvání hovoru VoIP atd. Pokud by každý z mnoha tisíců nebo milionů zrn měl hlásit metriky jednomu globálnímu agregátoru, agregátor by se okamžitě přetížil a nemohl zpracovat záplavu sestav. Alternativním přístupem je převést tento úkol na 2 (nebo více) kroků, aby se snížila agregace stylu. První vrstva agregace se provádí tak, že vykazuje agregační agregaci, která odesílá metriky do bezstavového pracovního procesu. Modul Orleans runtime automaticky vytvoří více aktivací bezstavového pracovního intervalu s každým silem. Vzhledem k tomu, že všechna taková volání budou zpracována místně bez vzdálených volání nebo serializace zpráv, náklady na takovou agregaci budou výrazně nižší než ve vzdáleném případě. Nyní může každá aktivace bezstavového agregace bezstavového pracovního procesu nezávisle nebo v koordinaci s jinými místními aktivacemi odesílat agregované sestavy globálnímu konečnému agregátoru (nebo do jiné vrstvy redukce v případě potřeby) bez přetížení.