Bagikan melalui


Penempatan grain

Orleans memastikan bahwa ketika panggilan biji-bijian dilakukan, ada instans biji-bijian yang tersedia dalam memori di beberapa server di kluster untuk menangani permintaan. Jika butir saat ini tidak aktif di kluster, Orleans pilih salah satu server untuk mengaktifkan biji-bijian. Ini disebut penempatan biji-bijian. Penempatan juga merupakan salah satu cara beban seimbang: bahkan penempatan biji-bijian sibuk membantu bahkan beban kerja di seluruh kluster.

Proses penempatan di sepenuhnya dapat dikonfigurasi Orleans : pengembang dapat memilih dari serangkaian kebijakan penempatan di luar kotak seperti logika acak, prefer-local, dan berbasis beban, atau kustom dapat dikonfigurasi. Ini memungkinkan fleksibilitas penuh dalam memutuskan di mana butir dibuat. Misalnya, biji-bijian dapat ditempatkan di server yang dekat dengan sumber daya yang perlu mereka operasikan atau dekat dengan biji-bijian lain tempat mereka berkomunikasi. Secara default, Orleans akan memilih server acak yang kompatibel.

Strategi penempatan yang Orleans menggunakan dapat dikonfigurasi secara global atau per kelas grain.

Penempatan acak

Server dipilih secara acak dari server yang kompatibel di kluster. Strategi penempatan ini dikonfigurasi dengan menambahkan ke RandomPlacementAttribute butir.

Penempatan lokal

Jika server lokal kompatibel, pilih server lokal, jika tidak, pilih server acak. Strategi penempatan ini dikonfigurasi dengan menambahkan ke PreferLocalPlacementAttribute butir.

Penempatan berbasis hash

Hash id butir ke bilangan bulat non-negatif dan modulo dengan jumlah server yang kompatibel. Pilih server yang sesuai dari daftar server yang kompatibel yang diurutkan menurut alamat server. Perhatikan bahwa ini tidak dijamin tetap stabil saat keanggotaan kluster berubah. Secara khusus, menambahkan, menghapus, atau memulai ulang server dapat mengubah server yang dipilih untuk id biji-bijian tertentu. Karena biji-bijian yang ditempatkan menggunakan strategi ini terdaftar di direktori biji-bijian, perubahan keputusan penempatan ini karena perubahan keanggotaan biasanya tidak memiliki efek yang nyata.

Strategi penempatan ini dikonfigurasi dengan menambahkan ke HashBasedPlacementAttribute butir.

Penempatan berbasis jumlah aktivasi

Strategi penempatan ini berniat untuk menempatkan aktivasi biji-bijian baru di server yang paling tidak banyak dimuat berdasarkan jumlah butiran yang baru-baru ini sibuk. Ini termasuk mekanisme di mana semua server secara berkala menerbitkan jumlah total aktivasi mereka ke semua server lain. Direktur penempatan kemudian memilih server yang diprediksi memiliki aktivasi terkecil dengan memeriksa jumlah aktivasi yang terakhir dilaporkan dan memprediksi jumlah aktivasi saat ini berdasarkan jumlah aktivasi terbaru yang dibuat oleh direktur penempatan di server saat ini. Direktur memilih beberapa server secara acak saat membuat prediksi ini, untuk menghindari beberapa server terpisah yang membebani server yang sama. Secara default, dua server dipilih secara acak, tetapi nilai ini dapat dikonfigurasi melalui ActivationCountBasedPlacementOptions.

Algoritma ini didasarkan pada tesis The Power of Two Choices in Randomized Load Balancing oleh Michael David Mitzenmacher, dan juga digunakan dalam Nginx untuk penyeimbangan beban terdistribusi, seperti yang dijelaskan dalam artikel NGINX dan Algoritma Load Balancing "Power of Two Choices".

Strategi penempatan ini dikonfigurasi dengan menambahkan ke ActivationCountBasedPlacementAttribute butir.

Penempatan pekerja tanpa status

Penempatan pekerja tanpa status adalah strategi penempatan khusus yang digunakan oleh biji-bijian pekerja tanpa status. Penempatan ini beroperasi hampir identik kecuali PreferLocalPlacement bahwa setiap server dapat memiliki beberapa aktivasi biji-bijian yang sama dan biji-bijian tidak terdaftar di direktori biji-bijian karena tidak perlu.

Strategi penempatan ini dikonfigurasi dengan menambahkan ke StatelessWorkerAttribute butir.

Penempatan berbasis peran silo

Strategi penempatan deterministik yang menempatkan biji-bijian pada silo dengan peran tertentu. Strategi penempatan ini dikonfigurasi dengan menambahkan ke SiloRoleBasedPlacementAttribute butir.

Penempatan yang dioptimalkan sumber daya

Strategi penempatan yang dioptimalkan sumber daya mencoba mengoptimalkan sumber daya kluster dengan menyeimbangkan aktivasi biji-bijian di seluruh silo berdasarkan memori dan penggunaan CPU yang tersedia. Ini menetapkan bobot ke statistik runtime untuk memprioritaskan sumber daya yang berbeda dan menghitung skor yang dinormalisasi untuk setiap silo. Silo dengan skor terendah dipilih untuk menempatkan aktivasi yang akan datang. Normalisasi memastikan bahwa setiap properti berkontribusi secara proporsional terhadap skor keseluruhan. Bobot dapat disesuaikan melalui ResourceOptimizedPlacementOptions berdasarkan persyaratan dan prioritas khusus pengguna untuk sumber daya yang berbeda.

Selain itu, strategi penempatan ini memaparkan opsi untuk membangun preferensi yang lebih kuat terhadap silo lokal (yang mendapat permintaan untuk membuat penempatan baru) untuk dipilih sebagai target aktivasi. Ini dikontrol melalui LocalSiloPreferenceMargin properti yang merupakan bagian dari opsi.

Selain itu, algoritma adaptif online memberikan efek smoothing yang menghindari penurunan sinyal cepat dengan mengubahnya menjadi proses pembusukan seperti polinomial. Ini sangat penting untuk penggunaan CPU, dan secara keseluruhan berkontribusi untuk menghindari kejenuhan sumber daya pada silo, terutama yang baru bergabung sekali.

Algoritma ini didasarkan pada: Penempatan berbasis sumber daya dengan pemfilteran Kalman mode ganda kooperatif

Strategi penempatan ini dikonfigurasi dengan menambahkan ke ResourceOptimizedPlacementAttribute butir.

Memilih strategi penempatan

Memilih strategi penempatan biji-bijian yang sesuai, di luar default yang Orleans menyediakan, memerlukan pemantauan dan evaluasi pengembang. Pilihan strategi penempatan harus didasarkan pada ukuran dan kompleksitas aplikasi, karakteristik beban kerja, dan lingkungan penyebaran.

Penempatan acak bergantung pada Undang-Undang Angka Besar, jadi biasanya default yang baik ketika ada beban yang tidak dapat diprediksi yang tersebar di sejumlah besar butir (10.000 plus).

Penempatan berbasis jumlah aktivasi juga memiliki elemen acak untuk itu, mengandalkan prinsip Power of Two Choices, yang merupakan algoritma yang umum digunakan untuk penyeimbangan beban terdistribusi dan digunakan dalam penyeimbang beban populer. Silo sering menerbitkan statistik run-time ke silo lain dalam kluster, termasuk:

  • Memori yang tersedia, total memori fisik, dan penggunaan memori.
  • Penggunaan CPU.
  • Jumlah aktivasi total dan jumlah aktivasi aktif terbaru.
    • Jendela geser aktivasi yang aktif dalam beberapa detik terakhir, kadang-kadang disebut sebagai set kerja aktivasi.

Dari statistik ini, hanya jumlah aktivasi yang saat ini digunakan untuk menentukan beban pada silo tertentu.

Pada akhirnya, Anda harus bereksperimen dengan strategi yang berbeda dan memantau metrik performa untuk menentukan yang paling cocok. Dengan memilih strategi penempatan grain yang tepat, Anda dapat mengoptimalkan performa, skalabilitas, dan efektivitas biaya aplikasi Anda Orleans .

Mengonfigurasi strategi penempatan default

Orleans akan menggunakan penempatan acak kecuali default ditimpa. Strategi penempatan default dapat diambil alih dengan mendaftarkan implementasi PlacementStrategy selama konfigurasi:

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

Mengonfigurasi strategi penempatan untuk biji-bijian

Strategi penempatan untuk jenis biji-bijian dikonfigurasi dengan menambahkan atribut yang sesuai pada kelas biji-bijian. Atribut yang relevan ditentukan dalam bagian strategi penempatan.

Sampel strategi penempatan kustom

Pertama-tama tentukan kelas yang mengimplementasikan IPlacementDirector antarmuka, membutuhkan satu metode. Dalam contoh ini, kami berasumsi Anda memiliki fungsi GetSiloNumber yang didefinisikan yang akan mengembalikan angka silo mengingat Guid biji-bijian yang akan dibuat.

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

Anda kemudian perlu menentukan dua kelas untuk memungkinkan kelas biji-bijian ditetapkan ke strategi:

[Serializable]
public sealed class SamplePlacementStrategy : PlacementStrategy
{
}

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

Kemudian cukup tandai kelas biji-bijian apa pun yang ingin Anda gunakan strategi ini dengan atribut :

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

Dan akhirnya, daftarkan strategi saat Anda membangun 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));
}

Untuk contoh sederhana kedua yang menunjukkan penggunaan konteks penempatan lebih lanjut, lihat PreferLocalPlacementDirector di repositori Orleans sumber