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 nejtuitivnější výraz virtuální aktor modelu, kde každé zrno odpovídá entitě s jedinečným typem/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 dekomprimovat, než je možné je směrovat do cílového zrna pro zpracování, není taková dekomprimační nebo směrovací logika svázaná s konkrétní entitou v aplikaci a může snadno škálovat.

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é pracovní jádra mají následující vlastnosti, které jejich provádění výrazně odlišují od běžných tříd jader.

  1. Modul Orleans runtime je schopen a vytvoří několik aktivací bezstavové pracovní úlohy na siloách různých clusterů.
  2. Bezstavové pracovní jednotky zpracovávají požadavky lokálně, pokud je silo kompatibilní, a proto nevznikají náklady na sítě ani serializaci. Pokud místní silo není kompatibilní, požadavky se předávají do kompatibilního sila.
  3. Tento Orleans runtime automaticky vytvoří další aktivace bezstavového pracovního zrna, pokud jsou ty stávající zaneprázdněny. 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 bodů 2 a 3 nejsou jednotlivé aktivace bezstavových procesů adresovatelné. Dva následné požadavky na bezstavovou pracovní jednotku mohou být zpracovány různými aktivacemi téže.

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 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 zrna je stejné jako volání jakéhokoli jiného zrna. Jediným rozdílem je, že ve většině případů se používá jedno ID zrna, například 0 nebo Guid.Empty. Pokud máte více bezstavových poolů pracovníků typu grain, je žádoucí mít pro každý z nich jedno ID.

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

Tato třída definuje bezstavovou třídu zrna pracovníka 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é grain třídy. Stejně jako jakákoli jiná zrna, jsou bezstavová pracovní zrna ve výchozím nastavení nereentrantní. Je možné je explicitně udělat znovuzaveditelné přidáním ReentrantAttribute do třídy zrnitosti.

Stát

Část "bezstavový" v termínu "bezstavový pracovník" neznamená, že bezstavový pracovník nemůže mít stav a 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. Jelikož lze na stejných nebo různých silech clusteru vytvořit více aktivací bezstavové pracovní jednotky, neexistuje snadný mechanismus pro koordinaci stavu uchovávaného různými aktivacemi.

Několik užitečných vzorů zahrnuje bezstavového pracovníka uchovávajícího stav.

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

Pro položky mezipaměti s vysokou zátěží, které mají vysokou propustnost, je uchovávání těchto položek v bezstavovém pracovním vláknu:

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

Snížení agregace stylů

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 zahrnují hlášení několika hráčů na každou herní mapu, průměrnou dobu trvání VoIP hovoru atd. Pokud by každé ze stovek tisíců nebo milionů zrn hlásilo své metriky jednomu globálnímu agregátoru, agregátor by se okamžitě přetížil a nemohl zpracovat příval zpráv. Alternativním přístupem je rozčlenit tento úkol na 2 (nebo více) kroky, aby se omezilo slučování stylů. První vrstva agregace se provádí tím, že reportovací jednotka odesílá své metriky do bezstavové pracovní jednotky pro předběžnou agregaci. Modul Orleans runtime automaticky vytvoří více aktivací bezstavových pracovních zrn 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 pracovního zrna, nezávisle nebo v koordinaci s jinými místními aktivacemi, odesílat své agregované sestavy globálnímu konečnému agregátoru (nebo do jiné redukční vrstvy, pokud to bude nutné) bez přetížení.