Utbildning
Modul
Skapa din första Orleans-app med ASP.NET Core 8.0 - Training
Lär dig hur du skapar molnbaserade, distribuerade appar med Orleans.
Den här webbläsaren stöds inte längre.
Uppgradera till Microsoft Edge och dra nytta av de senaste funktionerna och säkerhetsuppdateringarna, samt teknisk support.
Orleans ser till att när ett kornigt anrop görs finns det en instans av det kornet tillgängligt i minnet på någon server i klustret för att hantera begäran. Om kornet inte är aktivt i klustret Orleans väljer du en av servrarna för att aktivera kornet på. Detta kallas kornplacering. Placering är också ett sätt att balansera belastningen: även placeringen av upptagna korn hjälper till att jämna ut arbetsbelastningen i klustret.
Placeringsprocessen i Orleans är helt konfigurerbar: utvecklare kan välja mellan en uppsättning färdiga placeringsprinciper, till exempel slumpmässig, föredrar lokal och belastningsbaserad eller anpassad logik kan konfigureras. Detta ger fullständig flexibilitet när du bestämmer var korn skapas. Till exempel kan korn placeras på en server nära resurser som de behöver arbeta på eller nära andra korn som de kommunicerar med. Som standard Orleans väljer du en slumpmässigt kompatibel server.
Placeringsstrategin som Orleans använder kan konfigureras globalt eller per kornklass.
En server väljs slumpmässigt från de kompatibla servrarna i klustret. Den här placeringsstrategin konfigureras genom att lägga till i RandomPlacementAttribute ett korn.
Om den lokala servern är kompatibel väljer du den lokala servern, annars väljer du en slumpmässig server. Den här placeringsstrategin konfigureras genom att lägga till i PreferLocalPlacementAttribute ett korn.
Hash korn-ID till ett icke-negativt heltal och modulera det med antalet kompatibla servrar. Välj motsvarande server i listan över kompatibla servrar som sorteras efter serveradress. Observera att detta inte garanteras vara stabilt när klustermedlemskapet ändras. Mer specifikt kan tillägg, borttagning eller omstart av servrar ändra den server som valts för ett angivet korn-ID. Eftersom korn som placeras med den här strategin registreras i kornkatalogen har den här ändringen i placeringsbeslutet eftersom medlemskapsändringar vanligtvis inte har någon märkbar effekt.
Den här placeringsstrategin konfigureras genom att lägga till i HashBasedPlacementAttribute ett korn.
Den här placeringsstrategin avser att placera nya kornaktiveringar på den minst hårt belastade servern baserat på antalet nyligen upptagna korn. Den innehåller en mekanism där alla servrar regelbundet publicerar sitt totala aktiveringsantal till alla andra servrar. Placeringschefen väljer sedan en server som förväntas ha minst aktiveringar genom att undersöka det senast rapporterade aktiveringsantalet och förutsäga det aktuella aktiveringsantalet baserat på det senaste aktiveringsantalet som gjorts av placeringschefen på den aktuella servern. Chefen väljer flera servrar slumpmässigt när du gör den här förutsägelsen för att undvika att flera separata servrar överbelastar samma server. Som standard väljs två servrar slumpmässigt, men det här värdet kan konfigureras via ActivationCountBasedPlacementOptions.
Den här algoritmen baseras på avhandlingen The Power of Two Choices in Randomized Load Balancing av Michael David Mitzenmacher och används även i Nginx för distribuerad belastningsutjämning, enligt beskrivningen i artikeln NGINX och algoritmen "Power of Two Choices".
Den här placeringsstrategin konfigureras genom att lägga till i ActivationCountBasedPlacementAttribute ett korn.
Tillståndslös arbetsplacering är en särskild placeringsstrategi som används av tillståndslösa arbetskorn. Den här placeringen fungerar nästan identiskt PreferLocalPlacement med förutom att varje server kan ha flera aktiveringar av samma kornighet och att kornet inte är registrerat i kornkatalogen eftersom det inte finns något behov.
Den här placeringsstrategin konfigureras genom att lägga till i StatelessWorkerAttribute ett korn.
En deterministisk placeringsstrategi som placerar korn på silor med en specifik roll. Den här placeringsstrategin konfigureras genom att lägga till i SiloRoleBasedPlacementAttribute ett korn.
Den resursoptimerade placeringsstrategin försöker optimera klusterresurser genom att balansera kornaktiveringar mellan silor baserat på tillgängligt minne och CPU-användning. Den tilldelar vikter till körningsstatistik för att prioritera olika resurser och beräknar en normaliserad poäng för varje silo. Silon med lägst poäng väljs för att placera den kommande aktiveringen. Normalisering säkerställer att varje egenskap bidrar proportionellt till den övergripande poängen. Vikter kan justeras via ResourceOptimizedPlacementOptions baserat på användarspecifika krav och prioriteringar för olika resurser.
Dessutom exponerar den här placeringsstrategin ett alternativ för att skapa en starkare inställning till den lokala silon (den som fick begäran om att göra en ny placering) som ska väljas som mål för aktiveringen. Detta styrs via egenskapen LocalSiloPreferenceMargin
som är en del av alternativen.
Dessutom ger en adaptiv algoritm online en utjämningseffekt som undviker snabba signalfall genom att omvandla den till en polynomliknande förfallsprocess. Detta är särskilt viktigt för CPU-användning och bidrar totalt sett till att undvika resursmättnad på silon, särskilt nyligen anslutna en gång.
Den här algoritmen baseras på: Resursbaserad placering med kooperativ Kalman-filtrering med dubbla lägen
Den här placeringsstrategin konfigureras genom att lägga till i ResourceOptimizedPlacementAttribute ett korn.
Om du väljer lämplig strategi för kornplacering, utöver de standardvärden som Orleans finns, krävs övervakning och utvärdering av utvecklare. Valet av placeringsstrategi bör baseras på appens storlek och komplexitet, arbetsbelastningsegenskaper och distributionsmiljö.
Slumpmässig placering är beroende av lagen om stora tal, så det är vanligtvis en bra standard när det finns en oförutsägbar belastning spridd över ett stort antal korn (10 000 plus).
Aktiveringsbaserad placering har också ett slumpmässigt element i den, som förlitar sig på principen Power of Two Choices, som är en vanlig algoritm för distribuerad belastningsutjämning och används i populära lastbalanserare. Silos publicerar ofta körningsstatistik till andra silor i klustret, inklusive:
Från den här statistiken används endast aktiveringsantalet för att fastställa belastningen på en viss silo.
I slutändan bör du experimentera med olika strategier och övervaka prestandamått för att fastställa den bästa passformen. Genom att välja rätt strategi för kornplacering kan du optimera prestanda, skalbarhet och kostnadseffektivitet för dina Orleans appar.
Orleans använder slumpmässig placering om inte standardvärdet åsidosätts. Standardplaceringsstrategin kan åsidosättas genom att registrera en implementering av PlacementStrategy under konfigurationen:
siloBuilder.ConfigureServices(services =>
services.AddSingleton<PlacementStrategy, MyPlacementStrategy>());
Placeringsstrategin för en korntyp konfigureras genom att lägga till lämpligt attribut i kornklassen. Relevanta attribut anges i avsnitten för placeringsstrategier .
Definiera först en klass som implementerar IPlacementDirector gränssnitt, vilket kräver en enda metod. I det här exemplet antar vi att du har en definierad funktion GetSiloNumber
som returnerar ett silonummer med tanke på det Guid korn som ska skapas.
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]);
}
}
Sedan måste du definiera två klasser för att tillåta att kornklasser tilldelas till strategin:
[Serializable]
public sealed class SamplePlacementStrategy : PlacementStrategy
{
}
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public sealed class SamplePlacementStrategyAttribute : PlacementAttribute
{
public SamplePlacementStrategyAttribute() :
base(new SamplePlacementStrategy())
{
}
}
Tagga sedan bara alla kornklasser som du vill använda den här strategin med attributet:
[SamplePlacementStrategy]
public class MyGrain : Grain, IMyGrain
{
// ...
}
Och slutligen registrerar du strategin när du skapar 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));
}
Ett andra enkelt exempel som visar ytterligare användning av placeringskontexten PreferLocalPlacementDirector
finns i källdatabasen Orleans
Feedback om .NET
.NET är ett öppen källkod projekt. Välj en länk för att ge feedback:
Utbildning
Modul
Skapa din första Orleans-app med ASP.NET Core 8.0 - Training
Lär dig hur du skapar molnbaserade, distribuerade appar med Orleans.