Umístění zrn
Orleans zajišťuje, že při volání zrnka existuje instance tohoto zrnka dostupná v paměti na některém serveru v clusteru pro zpracování požadavku. Pokud zrno aktuálně není aktivní v clusteru, Orleans vybere jeden ze serverů, aby na něm zrno aktivoval. To se nazývá umístění zrn. Umístění je také jedním ze způsobů, jak vyrovnat pracovní zátěž: rovnoměrné rozložení zaneprázdněných zrn pomáhá vyrovnat pracovní zátěž v rámci clusteru.
Proces umísťování v Orleans je plně konfigurovatelný: vývojáři si můžou vybrat ze sady předem připravené zásady umístění, jako jsou náhodné, preferované místní a na základě zatížení nebo je možné nakonfigurovat vlastní logiku. To umožňuje plnou flexibilitu při rozhodování o tom, kde se zrna vytvářejí. Zrnka se například dají umístit na server blízko k prostředkům, na kterých potřebují pracovat, nebo blízko k jiným zrnům, se kterými komunikují. Ve výchozím nastavení Orleans vybere náhodný kompatibilní server.
Strategii umístění, kterou Orleans používá, je možné nakonfigurovat globálně nebo podle třídy obilí.
Náhodné umístění
Server je náhodně vybrán z kompatibilních serverů v clusteru. Tato strategie umístění se konfiguruje přidáním RandomPlacementAttribute k datovému bloku.
Místní umístění
Pokud je místní server kompatibilní, vyberte místní server, jinak vyberte náhodný server. Tato strategie umístění se konfiguruje přidáním PreferLocalPlacementAttribute do podrobného intervalu.
Umístění založené na hodnotě hash
Převeďte ID zrna pomocí hashovací funkce na nezáporné celé číslo a modulujte ho s počtem kompatibilních serverů. Ze seznamu kompatibilních serverů seřazených podle adresy serveru vyberte odpovídající server. Mějte na paměti, že to není zaručeno, že zůstane stabilní při změnách členství v clusteru. Konkrétně přidání, odebrání nebo restartování serverů může změnit server vybraný pro dané ID zrna. Vzhledem k tomu, že zrna umístěná pomocí této strategie jsou registrována v adresáři zrn, nemá tato změna rozhodnutí o umístění při změně členství obvykle výrazný vliv.
Tato strategie umístění se konfiguruje přidáním HashBasedPlacementAttribute ke grainu.
Umístění na základě počtu aktivací
Tato strategie umístění má za cíl umístit nové aktivace zrn na nejméně zatížený server na základě počtu nedávno vytížených zrn. Zahrnuje mechanismus, ve kterém všechny servery pravidelně publikují celkový počet aktivací na všechny ostatní servery. Adresář umístění pak vybere server, který je předpovězen, aby měl nejmenší počet aktivací prozkoumáním počtu naposledy ohlášených aktivací a predikuje aktuální počet aktivací na základě nedávného počtu aktivací provedeného adresářem umístění na aktuálním serveru. Při provádění této předpovědi vybere ředitel náhodně několik serverů, aby se zabránilo přetížení více samostatných serverů stejného serveru. Ve výchozím nastavení jsou vybrány dva servery náhodně, ale tato hodnota je konfigurovatelná prostřednictvím ActivationCountBasedPlacementOptions.
Tento algoritmus vychází z práce Výkon dvou možností v randomizovaném vyrovnávání zatížení MichaelEm Mitzenmacherema používá se také v Nginx pro distribuované vyrovnávání zatížení, jak je popsáno v článku NGINX a "Výkon dvou voleb" Load-Balancing Algoritmus.
Tato strategie umístění se konfiguruje přidáním ActivationCountBasedPlacementAttribute do zrna.
Umístění bezstavového pracovníka
Strategie umístění bezstavových pracovníků je zvláštní strategie, kterou používají bezstavoví pracovníci grains. Toto umístění funguje téměř totožně jako PreferLocalPlacement s tím rozdílem, že každý server může mít více aktivací stejného zrna a zrno není zaregistrované v adresáři zrn, protože to není potřeba.
Tato strategie umístění se konfiguruje přidáním StatelessWorkerAttribute ke zrnu.
Umístění na základě role v silech
Deterministická strategie umístění, která umísťuje zrnka na sila s konkrétní rolí. Tato strategie umístění se konfiguruje přidáním SiloRoleBasedPlacementAttribute ke zrnu.
Optimalizované umístění zdrojů
Strategie umístění optimalizovaná pro prostředky se pokouší optimalizovat prostředky clusteru vyvážením aktivací úloh napříč sily na základě využití dostupné paměti a procesoru. Přiřazuje váhu statistikám za běhu, aby přiřadila prioritu různým prostředkům a vypočítá normalizované skóre pro každé silo. Silo s nejnižším skóre je vybráno pro umístění nadcházející aktivace. Normalizace zajišťuje, že každá vlastnost přispívá úměrně celkovému skóre. Váhy lze upravit pomocí ResourceOptimizedPlacementOptions podle specifických potřeb a priorit uživatele pro různé zdroje.
Tato strategie umístění navíc zpřístupňuje možnost vytvořit silnější předvolbu pro místní silo (to, které obdrželo žádost o vytvoření nového umístění), které bude vybráno jako cíl aktivace. Toto je řízeno prostřednictvím vlastnosti LocalSiloPreferenceMargin
, která je součástí možností.
Také online, adaptivní algoritmus poskytuje vyrovnávací efekt, který zabraňuje rychlým poklesům signálu tím, že ho transformuje do procesu podobného polynomiálnímu útlumu. To je obzvlášť důležité pro využití procesoru a celkově přispívá k tomu, aby se zabránilo nasycení prostředků na silech, zejména těch nově připojených.
Tento algoritmus je založený na: umístění založené na prostředcích s kooperativním duálním režimem filtrování Kalman
Tato strategie umístění se konfiguruje přidáním ResourceOptimizedPlacementAttribute do zrna.
Volba strategie umístění
Volba vhodné strategie pro umístění zrna, kromě výchozích nastavení, která Orleans poskytuje, vyžaduje monitorování a hodnocení ze strany vývojářů. Volba strategie umístění by měla vycházet z velikosti a složitosti aplikace, charakteristik úloh a prostředí nasazení.
Náhodné umístění se zakládá na Zákon velkých čísel, takže je obvykle dobrou výchozí volbou, pokud existuje nepředvídatelné zatížení rozložené na velký počet zrn (10 000 a více).
Umístění založené na počtu aktivací má také náhodný prvek, který se spoléhá na princip Power of Two Choices, což je běžně používaný algoritmus pro distribuované vyrovnávání zatížení a používá se v oblíbených nástrojích pro vyrovnávání zatížení. Sila často publikují statistiky za běhu do jiných sila v clusteru, včetně:
- Dostupná paměť, celková fyzická paměť a využití paměti.
- Využití procesoru
- Celkový počet aktivací a nedávný počet aktivních aktivací
- Posuvné okno aktivací, které byly v posledních několika sekundách aktivní, někdy nazývané jako pracovní sada aktivací.
Z těchto statistik se k určení zatížení daného sila aktuálně používají pouze počty aktivací.
Nakonec byste měli experimentovat s různými strategiemi a monitorovat metriky výkonu, abyste zjistili, co nejlépe vyhovuje. Výběrem správné strategie umístění grains můžete optimalizovat výkon, škálovatelnost a efektivitu nákladů vašich Orleans aplikací.
Konfigurace výchozí strategie umístění
Orleans použije náhodné umístění, pokud nebude výchozí nastavení přepsáno. Výchozí strategii umístění lze přepsat registrací implementace PlacementStrategy během konfigurace:
siloBuilder.ConfigureServices(services =>
services.AddSingleton<PlacementStrategy, MyPlacementStrategy>());
Konfigurujte strategii umístění pro zrnko
Strategie umístění pro typ zrnitosti je nakonfigurována přidáním příslušného atributu do třídy zrnitosti. Relevantní atributy jsou uvedeny v sekcích strategie umístění .
Ukázková strategie umístění na míru
Nejprve definujte třídu, která implementuje IPlacementDirector rozhraní, což vyžaduje jednu metodu. V tomto příkladu předpokládáme, že máte definovanou funkci GetSiloNumber
, která vrátí číslo sila na základě Guid zrní, které má být vytvořeno.
public class SamplePlacementStrategyFixedSiloDirector : IPlacementDirector
{
public Task<SiloAddress> OnAddActivation(
PlacementStrategy strategy,
PlacementTarget target,
IPlacementContext context)
{
var silos = context.GetCompatibleSilos(target).OrderBy(s => s).ToArray();
int silo = GetSiloNumber(target.GrainIdentity.PrimaryKey, silos.Length);
return Task.FromResult(silos[silo]);
}
}
Poté je potřeba definovat dvě třídy, které umožní přiřazení tříd typu grain ke strategii:
[Serializable]
public sealed class SamplePlacementStrategy : PlacementStrategy
{
}
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public sealed class SamplePlacementStrategyAttribute : PlacementAttribute
{
public SamplePlacementStrategyAttribute() :
base(new SamplePlacementStrategy())
{
}
}
Pak jednoduše označte všechny třídy zrnitosti, které chcete použít s atributem:
[SamplePlacementStrategy]
public class MyGrain : Grain, IMyGrain
{
// ...
}
A nakonec při sestavování SiloHostzaregistrujte strategii:
private static async Task<ISiloHost> StartSilo()
{
var builder = new HostBuilder(c =>
{
// normal configuration methods omitted for brevity
c.ConfigureServices(ConfigureServices);
});
var host = builder.Build();
await host.StartAsync();
return host;
}
private static void ConfigureServices(IServiceCollection services)
{
services.AddPlacementDirector<SamplePlacementStrategy, SamplePlacementStrategyFixedSiloDirector>();
}
Druhý jednoduchý příklad ukazující další použití kontextu umístění, viz PreferLocalPlacementDirector
ve zdrojovém úložišti Orleans.