Umístění zrnitosti

Orleans zajišťuje, že když se provede volání agregace, existuje instance tohoto agregace dostupná v paměti na některém serveru v clusteru pro zpracování požadavku. Pokud v clusteru aktuálně není aktivní agregační interval, vyberte jeden ze serverů, Orleans na které chcete aktivovat agregační interval. Tomu se říká umístění zrnitosti. Umístění je také jedním ze způsobů, jak vyrovnává zatížení: dokonce i umístění zaneprázdněných zrn pomáhá dokonce i zatížení v clusteru.

Proces Orleans umísťování 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.

Strategie umístění, která Orleans se používá, je možné nakonfigurovat globálně nebo podle třídy agregační.

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 do agregačního intervalu RandomPlacementAttribute .

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 do agregačního intervalu PreferLocalPlacementAttribute .

Umístění založené na hodnotě hash

Zatřiďujte ID agregační hodnoty na nezáporné celé číslo a moduloujte 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 agregace. Vzhledem k tomu, že se zrna umístěná pomocí této strategie registrují v adresáři zrn, tato změna rozhodnutí o umístění obvykle nemá výrazný vliv.

Tato strategie umístění se konfiguruje přidáním do agregačního intervalu HashBasedPlacementAttribute .

Umístění na základě počtu aktivací

Tato strategie umístění hodlá umístit nové aktivace zrn na nejméně silně zatížený server na základě počtu nedávno zaneprázdněný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 naposledy hlášeného počtu aktivací a predikcí aktuálního počtu aktivací na základě nedávného počtu aktivací provedeného adresářem umístění na aktuálním serveru. Při náhodném výběru několika serverů při provádění této předpovědi se při pokusu vyhnout více samostatným serverům přetíženým stejným serverem. Ve výchozím nastavení jsou náhodně vybrány dva servery, ale tato hodnota je konfigurovatelná prostřednictvím ActivationCountBasedPlacementOptions.

Tento algoritmus je založen na práci Power of Two Choices in Randomized Load Balance by Michael David Mitzenmacher, a používá se také v Nginx pro distribuované vyrovnávání zatížení, jak je popsáno v článku NGINX a algoritmus vyrovnávání zatížení Power of Two Choices.

Tato strategie umístění se konfiguruje přidáním do agregačního intervalu ActivationCountBasedPlacementAttribute .

Umístění bezstavového pracovního procesu

Umístění bezstavového pracovního procesu je zvláštní strategie umístění používaná bezstavovými pracovními zrnky. Toto umístění funguje téměř identicky s PreferLocalPlacement tím rozdílem, že každý server může mít více aktivací stejného agregace a v adresáři zrnitosti není zaregistrovaný, protože není potřeba.

Tato strategie umístění se konfiguruje přidáním do agregačního intervalu StatelessWorkerAttribute .

Umístění na základě role na základě sil

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 do agregačního intervalu SiloRoleBasedPlacementAttribute .

Volba strategie umístění

Volba vhodné strategie umístění podrobností nad rámec výchozích hodnot, která Orleans poskytuje, vyžaduje monitorování a hodnocení 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í závisí na zákonu velkých čísel, takže je obvykle dobrým výchozím nastavením v případě, že existuje nepředvídatelné zatížení rozložené na velký počet zrn (10 000 plus).

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 označované jako pracovní sada aktivace.

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í odstupňované úrovně můžete optimalizovat výkon, škálovatelnost a nákladovou efektivitu vašich Orleans aplikací.

Konfigurace výchozí strategie umístění

Orleans použije náhodné umístění, pokud není přepsáno výchozí umístění. Výchozí strategii umístění lze přepsat registrací implementace PlacementStrategy během konfigurace:

siloBuilder.ConfigureServices(services =>
    services.AddSingleton<PlacementStrategy, MyPlacementStrategy>());

Konfigurace strategie umístění pro agregační

Strategie umístění pro typ zrnitosti je nakonfigurována přidáním příslušného atributu do třídy zrnitosti. Příslušné atributy jsou uvedeny v oddílech strategie umístění.

Ukázková strategie vlastního umístění

Nejprve definujte třídu, která implementuje IPlacementDirector rozhraní, která vyžaduje jednu metodu. V tomto příkladu předpokládáme, že máte definovanou funkci GetSiloNumber , která vrátí číslo sil vzhledem k Guid tomu, že se má vytvořit agregační interval.

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]);
    }
}

Pak je potřeba definovat dvě třídy, které umožní přiřazení odstupňovaných tříd 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 strategii zaregistrujte při sestavování SiloHost:

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.AddSingletonNamedService<
        PlacementStrategy, SamplePlacementStrategy>(
            nameof(SamplePlacementStrategy));

    services.AddSingletonKeyedService<
        Type, IPlacementDirector, SamplePlacementStrategyFixedSiloDirector>(
            typeof(SamplePlacementStrategy));
}

Druhý jednoduchý příklad znázorňující další použití kontextu umístění najdete ve PreferLocalPlacementDirector zdrojovém Orleans úložišti.