Szemcsés elhelyezés

Orleans biztosítja, hogy a gabonahívások során a fürt egyes kiszolgálóinak memóriájában elérhető legyen egy példány a kérés kezeléséhez. Ha a gabona jelenleg nem aktív a fürtben, Orleans válasszon egy kiszolgálót a gabona aktiválásához. Ezt gabonaelhelyezésnek nevezzük. Az elhelyezés az egyik módja annak, hogy a terhelés kiegyensúlyozott legyen: még a foglalt szemcsék elhelyezése is segít a számítási feladatnak a fürtben.

Az elhelyezési folyamat Orleans teljes mértékben konfigurálható: a fejlesztők számos beépített elhelyezési szabályzat közül választhatnak, például véletlenszerű, prefer-local és terhelésalapú, vagy egyéni logikát. Ez lehetővé teszi a teljes rugalmasságot annak eldöntésében, hogy hol jönnek létre a szemek. A szemcsék például olyan erőforrásokhoz közeli kiszolgálón helyezhetők el, amelyeken működniük kell, vagy olyan más szemcsék közelében, amelyekkel kommunikálnak. Alapértelmezés szerint véletlenszerűen Orleans kompatibilis kiszolgálót választ.

A használt elhelyezési stratégia Orleans globálisan vagy szemcsénként konfigurálható.

Véletlenszerű elhelyezés

A rendszer véletlenszerűen kiválaszt egy kiszolgálót a fürt kompatibilis kiszolgálói közül. Ez az elhelyezési stratégia úgy van konfigurálva, hogy hozzáadja azt RandomPlacementAttribute egy szemcséhez.

Helyi elhelyezés

Ha a helyi kiszolgáló kompatibilis, válassza ki a helyi kiszolgálót, ellenkező esetben válasszon egy véletlenszerű kiszolgálót. Ez az elhelyezési stratégia úgy van konfigurálva, hogy hozzáadja azt PreferLocalPlacementAttribute egy szemcséhez.

Kivonatalapú elhelyezés

Kivonatoljuk a szemcseazonosítót egy nem negatív egész számra, és modulojuk a kompatibilis kiszolgálók számával. Válassza ki a megfelelő kiszolgálót a kiszolgálócím alapján megrendelt kompatibilis kiszolgálók listájából. Vegye figyelembe, hogy ez nem garantáltan stabil marad a fürttagság változásakor. A kiszolgálók hozzáadása, eltávolítása vagy újraindítása módosíthatja az adott gabonaazonosítóhoz kiválasztott kiszolgálót. Mivel az ezzel a stratégiával elhelyezett szemcsék a gabonakönyvtárban vannak regisztrálva, ez a változás az elhelyezési döntésben, mivel a tagság változásai általában nem észlelhetők.

Ez az elhelyezési stratégia úgy van konfigurálva, hogy hozzáadja azt HashBasedPlacementAttribute egy szemcséhez.

Aktiválás–darabszám alapú elhelyezés

Ez az elhelyezési stratégia új szemcseaktiválásokat kíván elhelyezni a legkevésbé nagy terhelésű kiszolgálón a közelmúltban foglalt szemek száma alapján. Tartalmaz egy mechanizmust, amelyben minden kiszolgáló rendszeresen közzéteszi a teljes aktiválási számát az összes többi kiszolgálón. Az elhelyezési igazgató ezután kiválaszt egy kiszolgálót, amely az előrejelzés szerint a legkevesebb aktiválással rendelkezik. Ehhez vizsgálja meg a legutóbb jelentett aktiválások számát, és adja meg az aktuális aktiválási szám előrejelzését az elhelyezési igazgató által az aktuális kiszolgálón végrehajtott legutóbbi aktiválási szám alapján. A rendező véletlenszerűen választ ki több kiszolgálót az előrejelzés során, hogy elkerülje, hogy több különálló kiszolgáló túlterhelje ugyanazt a kiszolgálót. Alapértelmezés szerint két kiszolgáló van kiválasztva véletlenszerűen, de ez az érték konfigurálható.ActivationCountBasedPlacementOptions

Ez az algoritmus Michael David Mitzenmacher the Power of Two Choices in Randomized Load Balancing című szakdolgozatán alapul, és az Nginxben is használatos az elosztott terheléselosztáshoz, az NGINX és a "Két választási lehetőség ereje" terheléselosztási algoritmus című cikkben leírtak szerint.

Ez az elhelyezési stratégia úgy van konfigurálva, hogy hozzáadja azt ActivationCountBasedPlacementAttribute egy szemcséhez.

Állapot nélküli munkavégző elhelyezése

Az állapot nélküli munkavégzők elhelyezése egy speciális elhelyezési stratégia, amelyet az állapot nélküli feldolgozó szemcsék használnak. Ez az elhelyezés szinte teljesen megegyezik PreferLocalPlacement azzal a kivételrel, hogy minden kiszolgáló több aktiválást is végezhet ugyanabból a magból, és a gabona nincs regisztrálva a gabonakönyvtárban, mivel nincs szükség rá.

Ez az elhelyezési stratégia úgy van konfigurálva, hogy hozzáadja azt StatelessWorkerAttribute egy szemcséhez.

Silószerepkör-alapú elhelyezés

Determinisztikus elhelyezési stratégia, amely a szemcséket egy adott szerepkörrel rendelkező silókra helyezi. Ez az elhelyezési stratégia úgy van konfigurálva, hogy hozzáadja azt SiloRoleBasedPlacementAttribute egy szemcséhez.

Erőforrás-optimalizált elhelyezés

Az erőforrás-optimalizált elhelyezési stratégia úgy próbálja optimalizálni a fürterőforrásokat, hogy a rendelkezésre álló memória és a PROCESSZORhasználat alapján kiegyensúlyozza a szemcsés aktiválásokat a silók között. Súlyokat rendel a futtatókörnyezeti statisztikákhoz, hogy rangsorolja a különböző erőforrásokat, és kiszámítsa az egyes silók normalizált pontszámát. A közelgő aktiválás elhelyezéséhez a legalacsonyabb pontszámmal rendelkező silót választjuk ki. A normalizálás biztosítja, hogy minden tulajdonság arányosan járuljon hozzá a teljes pontszámhoz. A súlyok a különböző erőforrások felhasználóspecifikus követelményei és prioritásai alapján módosíthatók ResourceOptimizedPlacementOptions .

Ezen kívül ez az elhelyezési stratégia lehetővé teszi a helyi siló (amely megkapta az új elhelyezésre vonatkozó kérést) erősebb előnyben részesítését az aktiválás céljaként. Ezt a LocalSiloPreferenceMargin beállítások részét képező tulajdonságon keresztül lehet szabályozni.

Emellett egy online adaptív algoritmus simító hatást biztosít, amely elkerüli a gyors jelcseppeket azáltal, hogy polinomszerű bomlási folyamattá alakítja. Ez különösen fontos a CPU-használat szempontjából, és összességében hozzájárul az erőforrások telítettségének elkerüléséhez a silókon, különösen az újonnan csatlakozók esetében.

Ez az algoritmus a következőn alapul: Erőforrás-alapú elhelyezés kooperatív kettős módú Kalman-szűréssel

Ez az elhelyezési stratégia úgy van konfigurálva, hogy hozzáadja azt ResourceOptimizedPlacementAttribute egy szemcséhez.

Elhelyezési stratégia kiválasztása

A megfelelő szemcsés elhelyezési stratégia kiválasztása az alapértelmezett beállításokon Orleans túl monitorozást és fejlesztői értékelést igényel. Az elhelyezési stratégia kiválasztásának az alkalmazás méretén és összetettségén, a számítási feladatok jellemzőin és az üzembe helyezési környezeten kell alapulnia.

A véletlenszerű elhelyezés a nagy számok törvényére támaszkodik, ezért általában jó alapértelmezett, ha nagy számú szemcse (10 000 plusz) között kiszámíthatatlan terhelés van elosztva.

Az aktiválási számlálóalapú elhelyezésnek van egy véletlenszerű eleme is, amely a Power of Two Choices elvre támaszkodik, amely az elosztott terheléselosztás általánosan használt algoritmusa, és népszerű terheléselosztókban használatos. A silók gyakran tesznek közzé futásidejű statisztikákat a fürt többi silójában, beleértve a következőket:

  • Rendelkezésre álló memória, teljes fizikai memória és memóriahasználat.
  • CPU-használat.
  • Az aktiválások teljes száma és a legutóbbi aktív aktiválások száma.
    • Az elmúlt néhány másodpercben aktív aktiválások tolóablaka, amelyet néha aktiválási munkakészletnek is neveznek.

Ezekből a statisztikákból jelenleg csak az aktiválási számok határozzák meg egy adott siló terhelését.

Végső soron különböző stratégiákkal kell kísérleteznie, és figyelnie kell a teljesítménymetrikákat a legjobb illeszkedés meghatározásához. A megfelelő szemcsés elhelyezési stratégia kiválasztásával optimalizálhatja az alkalmazások teljesítményét, méretezhetőségét Orleans és költséghatékonyságát.

Az alapértelmezett elhelyezési stratégia konfigurálása

Orleans véletlenszerű elhelyezést fog használni, kivéve, ha az alapértelmezett érték felül van bírálva. Az alapértelmezett elhelyezési stratégiát felül lehet bírálni a konfiguráció során egy implementáció regisztrálásával PlacementStrategy :

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

A szemcsék elhelyezési stratégiájának konfigurálása

A szemcsetípus elhelyezési stratégiája úgy van konfigurálva, hogy hozzáadja a megfelelő attribútumot a gabonaosztályhoz. A releváns attribútumok az elhelyezési stratégiák szakaszaiban vannak megadva.

Minta egyéni elhelyezési stratégia

Először definiáljon egy felületet megvalósító IPlacementDirector osztályt, amely egyetlen metódust igényel. Ebben a példában feltételezzük, hogy definiált egy függvényt GetSiloNumber , amely egy silószámot ad vissza a Guid létrehozandó szemcse alapján.

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

Ezután meg kell határoznia két osztályt, hogy lehetővé tegye a szemcsés osztályok hozzárendelését a stratégiához:

[Serializable]
public sealed class SamplePlacementStrategy : PlacementStrategy
{
}

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public sealed class SamplePlacementStrategyAttribute : PlacementAttribute
{
    public SamplePlacementStrategyAttribute() :
        base(new SamplePlacementStrategy())
    {
    }
}

Ezután csak címkézze fel a stratégiát használni kívánt gabonaosztályokat az attribútummal:

[SamplePlacementStrategy]
public class MyGrain : Grain, IMyGrain
{
    // ...
}

Végül regisztrálja a stratégiát a következő buildelésekor 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));
}

Az elhelyezési környezet további használatát bemutató második egyszerű példát a PreferLocalPlacementDirector forrásadattárban találja.Orleans