Delen via


Graanplaatsing

Orleans zorgt ervoor dat wanneer er een graanaanroep wordt gedaan, er een exemplaar van dat graan beschikbaar is in het geheugen op een server in het cluster om de aanvraag te verwerken. Als het graan momenteel niet actief is in het cluster, kiest Orleans een van de servers om het graan op te activeren. Dit wordt korrelplaatsinggenoemd. Plaatsing is ook een manier waarop de belasting wordt verdeeld: gelijkmatige plaatsing van actieve eenheden helpt de werkdruk gelijkmatig te verdelen over het cluster.

Het plaatsingsproces in Orleans is volledig configureerbaar: ontwikkelaars kunnen kiezen uit een set standaardplaatsingsbeleidsregels, zoals willekeurige, voorkeurs-lokale en op belasting gebaseerde logica, of aangepaste logica kan worden geconfigureerd. Dit biedt volledige flexibiliteit bij het bepalen waar korrels worden gemaakt. Korrels kunnen bijvoorbeeld worden geplaatst op een server dicht bij resources waarop ze moeten werken of dicht bij andere korrels waarmee ze communiceren. Standaard kiest Orleans een willekeurige compatibele server.

De plaatsingsstrategie die Orleans gebruikt, kan globaal of per graanklasse worden geconfigureerd.

Willekeurige plaatsing

Een server wordt willekeurig geselecteerd op de compatibele servers in het cluster. Deze plaatsingsstrategie wordt geconfigureerd door de RandomPlacementAttribute toe te voegen aan een graan.

Lokale plaatsing

Als de lokale server compatibel is, selecteert u de lokale server, anders selecteert u een willekeurige server. Deze plaatsingsstrategie wordt geconfigureerd door de PreferLocalPlacementAttribute toe te voegen aan een graan.

Plaatsing op basis van hash

Hash de grain-id naar een niet-negatief geheel getal en modulo het met het aantal compatibele servers. Selecteer de bijbehorende server in de lijst met compatibele servers die zijn besteld op serveradres. Houd er rekening mee dat dit niet gegarandeerd stabiel blijft wanneer het clusterlidmaatschap verandert. Het toevoegen, verwijderen of opnieuw opstarten van servers kan specifiek de server wijzigen die is geselecteerd voor een bepaalde grain-ID. Omdat grains die met deze strategie zijn geplaatst, worden geregistreerd in de grain directory, heeft deze wijziging in de plaatsingsbeslissing doorgaans geen merkbaar effect.

Deze plaatsingsstrategie wordt geconfigureerd door de HashBasedPlacementAttribute toe te voegen aan een graan.

Plaatsing op basis van activeringsaantallen

Deze plaatsingsstrategie is van plan nieuwe graanactiveringen te plaatsen op de minst zwaar belaste server op basis van het aantal recent drukke korrels. Het bevat een mechanisme waarin alle servers het totale aantal activeringen periodiek publiceren naar alle andere servers. De plaatsingsdirectie selecteert vervolgens een server die de minste activeringen heeft voorspeld door het laatst gerapporteerde aantal activeringen te onderzoeken en het huidige aantal activeringen te voorspellen op basis van het recente aantal activeringen dat is gemaakt door de plaatsingsbeheerder op de huidige server. De beheerder selecteert willekeurig meerdere servers bij het maken van deze voorspelling, om te voorkomen dat meerdere afzonderlijke servers dezelfde server overbelasten. Standaard worden twee servers willekeurig geselecteerd, maar deze waarde kan worden geconfigureerd via ActivationCountBasedPlacementOptions.

Dit algoritme is gebaseerd op de scriptie The Power of Two Choices in Randomized Load Balancing door Michael David Mitzenmacher, en wordt ook gebruikt in Nginx voor gedistribueerde taakverdeling, zoals beschreven in het artikel NGINX en de "Power of Two Choices" Load-Balancing Algorithm.

Deze plaatsingsstrategie wordt geconfigureerd door de ActivationCountBasedPlacementAttribute toe te voegen aan een graan.

Plaatsing van staatloze werknemers

De plaatsing van staatloze werknemers is een speciale plaatsingsstrategie die wordt gebruikt door staatloze werkrol korrels. Deze plaatsing werkt bijna identiek aan PreferLocalPlacement, behalve dat elke server meerdere activeringen van hetzelfde graan kan hebben en het graan niet is geregistreerd in de graanmap omdat er geen noodzaak is.

Deze plaatsingsstrategie wordt geconfigureerd door de StatelessWorkerAttribute toe te voegen aan een graan.

Plaatsing op basis van silo-rollen

Een deterministische plaatsingsstrategie waarmee korrels op silo's met een specifieke rol worden geplaatst. Deze plaatsingsstrategie wordt geconfigureerd door de SiloRoleBasedPlacementAttribute toe te voegen aan een graan.

Resources-geoptimaliseerde plaatsing

De resource-geoptimaliseerde plaatsingsstrategie probeert clusterresources te optimaliseren door grain-activeringen over silo's te balanceren op basis van het beschikbare geheugen- en CPU-gebruik. Het wijst gewichten toe aan runtimestatistieken om prioriteit te geven aan verschillende resources en berekent een genormaliseerde score voor elke silo. De silo met de laagste score wordt gekozen voor het plaatsen van de komende activering. Normalisatie zorgt ervoor dat elke eigenschap proportioneel bijdraagt aan de algehele score. Gewichten kunnen worden aangepast via de ResourceOptimizedPlacementOptions op basis van gebruikersspecifieke vereisten en prioriteiten voor verschillende resources.

Bovendien maakt deze plaatsingsstrategie een optie beschikbaar om een sterkere voorkeur te bouwen aan de lokale silo (degene die de aanvraag voor het maken van een nieuwe plaatsing) als het doel voor de activering heeft gekregen. Dit wordt beheerd via de eigenschap LocalSiloPreferenceMargin die deel uitmaakt van de opties.

Bovendien biedt een online, adaptief algoritme een afvlakkend effect dat snelle signaalverliezen vermijdt door het om te zetten in een polynomiaalachtig vervalproces. Dit is vooral belangrijk voor het CPU-gebruik en draagt in het algemeen bij aan het voorkomen van verzadiging van bronnen op de silo's, vooral bij nieuw toegevoegde silo's.

Dit algoritme is gebaseerd op: plaatsing op basis van resources met coöperatieve dual-mode Kalman-filtering

Deze plaatsingsstrategie wordt geconfigureerd door de ResourceOptimizedPlacementAttribute toe te voegen aan een graan.

Een plaatsingsstrategie kiezen

Voor het kiezen van de juiste strategie voor korrelplaatsing, naast de standaardwaarden die Orleans biedt, is bewaking en evaluatie van ontwikkelaars vereist. De keuze van de plaatsingsstrategie moet zijn gebaseerd op de grootte en complexiteit van de app, workloadkenmerken en implementatieomgeving.

Willekeurige plaatsing is afhankelijk van de wet van grote getallen, dus het is meestal een goede standaardinstelling wanneer er een onvoorspelbare belasting is verspreid over een groot aantal korrels (10.000 plus).

Plaatsing op basis van het aantal activeringen heeft er ook een willekeurig element voor, afhankelijk van het principe Power of Two Choices. Dit is een veelgebruikt algoritme voor gedistribueerde taakverdeling en wordt gebruikt in populaire load balancers. Silos publiceren regelmatig runtimestatistieken naar andere silos binnen de cluster, waaronder:

  • Beschikbaar geheugen, totaal fysiek geheugen en geheugengebruik.
  • CPU-gebruik.
  • Totaal aantal activeringen en recent aantal actieve activeringen.
    • Een schuifvenster van activeringen die in de afgelopen seconden actief waren, ook wel de activeringswerkset genoemd.

Vanuit deze statistieken worden alleen de activeringsaantallen gebruikt om de belasting van een bepaalde silo te bepalen.

Uiteindelijk moet u experimenteren met verschillende strategieën en prestatiemetrieken bewaken om de beste pasvorm te bepalen. Door de juiste korrelplaatsingsstrategie te selecteren, kunt u de prestaties, schaalbaarheid en kosteneffectiviteit van uw Orleans-apps optimaliseren.

De standaardplaatsingsstrategie configureren

Orleans gebruikt willekeurige plaatsing, tenzij de standaardinstelling wordt overschreven. De standaardplaatsingsstrategie kan worden overschreven door een implementatie van PlacementStrategy te registreren tijdens de configuratie:

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

De plaatsingsstrategie voor een graan configureren

De plaatsingsstrategie voor een graantype wordt geconfigureerd door het juiste kenmerk toe te voegen aan de graanklasse. De relevante kenmerken worden opgegeven in de plaatsingsstrategieën secties.

Voorbeeld van aangepaste plaatsingsstrategie

Definieer eerst een klasse die IPlacementDirector interface implementeert, waarvoor één methode is vereist. In dit voorbeeld wordt ervan uitgegaan dat u een functie hebt GetSiloNumber gedefinieerd die een silonummer retourneert op basis van de Guid van het graan dat wordt gemaakt.

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

Vervolgens moet u twee klassen definiëren zodat graanklassen aan de strategie kunnen worden toegewezen.

[Serializable]
public sealed class SamplePlacementStrategy : PlacementStrategy
{
}

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

Tag vervolgens alle graanklassen waarmee u deze strategie wilt gebruiken met het kenmerk:

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

En ten slotte registreert u de strategie wanneer u de SiloHostbouwt:

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

Raadpleeg de PreferLocalPlacementDirector in de Orleans bronopslagplaatsvoor een tweede eenvoudig voorbeeld dat het verdere gebruik van de plaatsingscontext demonstreert.