Sdílet prostřednictvím


Bezstavová pracovní zrna

Modul runtime ve výchozím nastavení Orleans nevytváří více než jednu aktivaci jednotky výpočetního výkonu v clustru. Jedná se o nejintuitivnější výraz modelu virtuálního aktéra, kde každé zrno odpovídá entitě s jedinečným typem/identitou. Někdy ale 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é potřebují dekompresi před směrováním do cílového uzlu pro zpracování, není tato dekompresní nebo směrovací logika vázána na konkrétní entitu a může snadno škálovat.

Když použijete StatelessWorkerAttribute pro třídu zrn, označuje to běhové prostředí Orleans, že zrní této třídy by se mělo zacházet jako s bezstavovými pracovními zrny. Bezstavová pracovní zrna mají následující vlastnosti, které činí jejich vykonávání velmi odlišným od normálních tříd zrn:

  1. Modul Orleans runtime může a vytváří více aktivací bezstavového pracovního procesu na různých silach v clusteru.
  2. Bezstavová pracovní zrna provádějí požadavky místně, za předpokladu, že je silo kompatibilní, a proto se neúčtují žádné náklady na síťovou komunikaci nebo serializaci. Pokud místní silo není kompatibilní, požadavky se přeposílají do sila kompatibilního.
  3. Modul Orleans runtime automaticky vytvoří další aktivace bezstavového pracovního zrnka, pokud jsou stávající aktivace zaneprázdněné. Maximální počet aktivací na silo je ve výchozím nastavení omezen počtem jader procesoru na počítači, pokud ho explicitně nezadáte pomocí volitelného maxLocalWorkers argumentu.
  4. Kvůli bodům 2 a 3 nejsou aktivace bezstavového pracovního procesu 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, která najde, a pokračuje pouze na poslední, pokud jsou všechny předchozí aktivace zaneprázdněny. 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 míra požadavků na bezstavový pracovní interval zvýší a stávající aktivace jsou všechny zaneprázdněné, modul runtime rozšíří fond aktivací až do limitu. Naopak když zatížení klesne a menší počet aktivací ji zvládne, aktivace na konci seznamu nebudou přijímat žádosti. Stanou se nečinné a nakonec se deaktivují standardním procesem shromažďování aktivace. Fond aktivací se tak nakonec zmenší tak, aby odpovídal zatížení.

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

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

Volání bezstavového pracovního grainu je stejné jako volání jakéhokoli jiného grainu. Jediným rozdílem je, že ve většině případů použijete jedno ID zrna, například 0 nebo Guid.Empty. Pokud je žádoucí mít více bezstavových fondů agregačních intervalů (jeden na ID), můžete použít více ID zrnitosti.

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

Tento příklad definuje bezstavovou třídu pracovní gráin, s maximálně jednou aktivací na silo.

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

Všimněte si, že StatelessWorkerAttribute nemění znovuvstupnost cílové zrnitostní třídy. Stejně jako jakákoli jiná zrnitost jsou bezstavová pracovní zrnka ve výchozím nastavení neopakována. Můžete je explicitně učinit znovuvstupnými tím, že přidáte ReentrantAttribute do třídy zrnitosti.

Stát

"Bezstavová" část "bezstavový pracovník" neznamená, že bezstavový pracovník nemůže mít stav, ani že je omezen pouze na provádění funkčních operací. Stejně jako jakýkoli jiný grán, může bezstavový pracovní grán načíst a udržovat v paměti libovolný stav, který potřebuje. Vzhledem k tomu, že na stejném a různých silach v clusteru je možné 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íky držící stav.

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

U položek horké mezipaměti, u kterých dochází k vysoké propustnosti, poskytuje uchovávání jednotlivých položek v bezstavovém pracovním zrnu tyto výhody:

  1. Automaticky se rozšiřuje v rámci silo a napříč všemi silo v clusteru.
  2. Data jsou vždy místně dostupná na silech, která obdržela požadavek klienta prostřednictvím své klientské brány, což umožňuje odpovědět na požadavky bez dalšího síťového přeskoku na jiné silo.

Agregace ve stylu redukčních metod

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. Mezi příklady patří hlášení počtu hráčů na mapu hry nebo průměrná doba trvání hovoru VoIP. Pokud každý z mnoha tisíc nebo milionů zrn oznámil metriku 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 agregaci ve stylu redukování, která se skládá ze dvou nebo více kroků. První vrstva agregace zahrnuje reportovací zrna odesílající své metriky do bezstavové pre-agregační jednotky pracovníka. Modul Orleans runtime automaticky vytvoří více aktivací bezstavového pracovního zrna na každém silu. Vzhledem k tomu, že Orleans všechna taková volání zpracovává místně bez vzdálených volání nebo serializace zpráv, náklady na tuto agregaci jsou výrazně menší než ve vzdáleném případě. Nyní může každá aktivace bezstavového pracovníka nezávisle nebo v koordinaci s dalšími místními aktivacemi odeslat svou agregovanou sestavu globálnímu konečnému agregátoru (nebo do jiné vrstvy redukce, pokud je to nutné) bez přetížení.