Tane yerleşimi

Orleans , bir taneli çağrı yapıldığında kümedeki bazı sunucularda isteği işlemek için bellekte bu dilimin bir örneğinin kullanılabilir olmasını sağlar. Kümede tahıl şu anda etkin değilse, Orleans kümeyi etkinleştirmek için sunuculardan birini seçer. Buna tahıl yerleştirme denir. Yerleştirme, yükün dengelenmesi için de bir yoldur: Meşgul dilimlerin yerleştirilmesi bile küme genelinde iş yükünün bile yerleştirilmesine yardımcı olur.

'deki Orleans yerleştirme işlemi tamamen yapılandırılabilir: Geliştiriciler rastgele, tercih edilen yerel ve yük tabanlı gibi kullanıma hazır yerleştirme ilkeleri arasından seçim yapabilir veya özel mantık yapılandırılabilir. Bu, tanelerin nerede oluşturulduğuna karar verirken tam esneklik sağlar. Örneğin, tanecikler, iletişim kuracakları diğer tanecikler üzerinde veya bunlara yakın bir konumda çalışması gereken kaynaklara yakın bir sunucuya yerleştirilebilir. Varsayılan olarak, Orleans rastgele uyumlu bir sunucu seçer.

Kullanılan yerleştirme stratejisi Orleans genel olarak veya her bir sınıf için yapılandırılabilir.

Rastgele yerleştirme

Kümedeki uyumlu sunuculardan rastgele bir sunucu seçilir. Bu yerleştirme stratejisi, öğesini bir taneye RandomPlacementAttribute ekleyerek yapılandırılır.

Yerel yerleştirme

Yerel sunucu uyumluysa yerel sunucuyu seçin, aksi takdirde rastgele bir sunucu seçin. Bu yerleştirme stratejisi, öğesini bir taneye PreferLocalPlacementAttribute ekleyerek yapılandırılır.

Karma tabanlı yerleştirme

Taneli kimliği negatif olmayan bir tamsayıya karma olarak ekleyin ve uyumlu sunucu sayısıyla modüle edin. Sunucu adresine göre sıralanmış uyumlu sunucular listesinden ilgili sunucuyu seçin. Küme üyeliği değiştikçe bunun kararlı kalmasının garanti edilmediğini unutmayın. Özellikle, sunucuları eklemek, kaldırmak veya yeniden başlatmak belirli bir taneli kimlik için seçilen sunucuyu değiştirebilir. Bu strateji kullanılarak yerleştirilen tanecikler grain dizinine kaydedildiğinden, üyelik değişiklikleri genellikle fark edilebilir bir etkiye sahip olmadığından yerleştirme kararında yapılan bu değişiklik fark edilebilir bir etkiye sahip değildir.

Bu yerleştirme stratejisi, öğesini bir taneye HashBasedPlacementAttribute ekleyerek yapılandırılır.

Etkinleştirme sayısı tabanlı yerleştirme

Bu yerleştirme stratejisi, son zamanlarda meşgul olan taneciklerin sayısına göre en az yüklü sunucuya yeni tane etkinleştirmeleri yerleştirmeyi amaçlıyor. Tüm sunucuların toplam etkinleştirme sayısını diğer tüm sunuculara düzenli aralıklarla yayımladığı bir mekanizma içerir. Yerleştirme yöneticisi daha sonra en son bildirilen etkinleştirme sayısını inceleyerek ve geçerli sunucudaki yerleştirme yöneticisi tarafından yapılan son etkinleştirme sayısına göre geçerli etkinleştirme sayısının tahminini yaparak en az etkinleştirmeye sahip olduğu tahmin edilen bir sunucu seçer. Yönetici, bu tahminde bulunurken birden çok ayrı sunucunun aynı sunucuyu aşırı yüklemesini önlemek amacıyla rastgele olarak birkaç sunucu seçer. Varsayılan olarak, rastgele iki sunucu seçilir, ancak bu değer aracılığıyla ActivationCountBasedPlacementOptionsyapılandırılabilir.

Bu algoritma, Michael David Mitzenmacher'ın Rastgele Yük Dengelemede İki Seçeneğin Gücü tezini temel alır ve NGINX ve "İki Seçeneğin Gücü" Yük Dengeleme Algoritması makalesinde açıklandığı gibi dağıtılmış yük dengeleme için Nginx'te de kullanılır.

Bu yerleştirme stratejisi, öğesini bir taneye ActivationCountBasedPlacementAttribute ekleyerek yapılandırılır.

Durum bilgisi olmayan çalışan yerleştirme

Durum bilgisi olmayan çalışan yerleştirme, durum bilgisi olmayan çalışan taneleri tarafından kullanılan özel bir yerleştirme stratejisidir. Bu yerleştirme neredeyse aynı şekilde PreferLocalPlacement çalışır, ancak her sunucunun aynı tanenin birden çok etkinleştirmesine sahip olması ve gerek kalmadığından tanecik dizinine kaydedilmemesidir.

Bu yerleştirme stratejisi, öğesini bir taneye StatelessWorkerAttribute ekleyerek yapılandırılır.

Silo-rol tabanlı yerleştirme

Belirli bir role sahip silolara taneler yerleştiren belirleyici bir yerleştirme stratejisi. Bu yerleştirme stratejisi, öğesini bir taneye SiloRoleBasedPlacementAttribute ekleyerek yapılandırılır.

Yerleştirme stratejisi seçme

Uygun taneli yerleştirme stratejisini, sağlayan varsayılanların Orleans ötesinde seçmek için izleme ve geliştirici değerlendirmesi gerekir. Yerleştirme stratejisi seçimi, uygulamanın boyutuna ve karmaşıklığına, iş yükü özelliklerine ve dağıtım ortamına dayalı olmalıdır.

Rastgele yerleştirme, Büyük Sayılar Yasası'na dayanır, bu nedenle çok sayıda taneye (10.000 artı) yayılan öngörülemeyen bir yük olduğunda genellikle iyi bir varsayılan değerdir.

Etkinleştirme sayısı tabanlı yerleştirme, dağıtılmış yük dengeleme için yaygın olarak kullanılan bir algoritma olan ve popüler yük dengeleyicilerde kullanılan İki Seçimin Gücü ilkesine dayanan rastgele bir öğeye de sahiptir. Silolar, aşağıdakiler de dahil olmak üzere çalışma zamanı istatistiklerini kümedeki diğer silolara sık sık yayımlar:

  • Kullanılabilir bellek, toplam fiziksel bellek ve bellek kullanımı.
  • CPU kullanımı.
  • Toplam etkinleştirme sayısı ve son etkin etkinleştirme sayısı.
    • Son birkaç saniye içinde etkin olan ve bazen etkinleştirme çalışma kümesi olarak da adlandırılan, etkinleştirmelerin kayan penceresi.

Bu istatistiklerden şu anda belirli bir silo üzerindeki yükü belirlemek için yalnızca etkinleştirme sayıları kullanılmaktadır.

Sonuç olarak, en uygunu belirlemek için farklı stratejilerle denemeler yapmalı ve performans ölçümlerini izlemeniz gerekir. Doğru gren yerleştirme stratejisini seçerek uygulamalarınızın Orleans performansını, ölçeklenebilirliğini ve uygun maliyetliliğini iyileştirebilirsiniz.

Varsayılan yerleştirme stratejisini yapılandırma

Orleans varsayılan geçersiz kılınmadığı sürece rastgele yerleştirme kullanır. Varsayılan yerleştirme stratejisi, yapılandırma sırasında uygulamasını PlacementStrategy kaydederek geçersiz kılınabilir:

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

Bir dilim için yerleştirme stratejisini yapılandırma

Bir tanecik türü için yerleştirme stratejisi, grain sınıfına uygun öznitelik eklenerek yapılandırılır. İlgili öznitelikler, yerleştirme stratejileri bölümlerinde belirtilir.

Örnek özel yerleştirme stratejisi

İlk olarak tek bir yöntem gerektiren arabirimi uygulayan IPlacementDirector bir sınıf tanımlayın. Bu örnekte, oluşturulmak üzere olan tanenin verileceği Guid silo numarasını döndürecek tanımlanmış bir işleviniz GetSiloNumber olduğunu varsayıyoruz.

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

Ardından, stratejiye taneli sınıfların atanmasına izin vermek için iki sınıf tanımlamanız gerekir:

[Serializable]
public sealed class SamplePlacementStrategy : PlacementStrategy
{
}

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

Ardından, bu stratejiyi kullanmak istediğiniz tüm tanecik sınıflarını özniteliğiyle etiketlemeniz yeter:

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

Son olarak, öğesini oluştururken stratejiyi SiloHostkaydedin:

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

Yerleştirme bağlamının daha fazla kullanımını gösteren ikinci bir basit örnek için PreferLocalPlacementDirector kaynak depodaki Orleans öğesine bakın