Bagikan melalui


Penempatan biji-bijian

Orleans memastikan bahwa ketika panggilan grain dilakukan, ada instance grain yang tersedia dalam memori di beberapa server di kluster untuk menangani permintaan. Jika grain saat ini tidak aktif di kluster, Orleans memilih salah satu server untuk mengaktifkan grain. Ini disebut penempatan gandum . Penempatan juga merupakan salah satu cara beban diseimbangkan: penempatan yang merata dari unit-unit sibuk membantu menyeimbangkan beban kerja di dalam kluster.

Proses penempatan di Orleans sepenuhnya dapat dikonfigurasi: pengembang dapat memilih dari serangkaian kebijakan penempatan langsung digunakan seperti acak, memilih lokal, dan berdasarkan beban, atau logika 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 yang kompatibel secara acak.

Strategi penempatan yang Orleans gunakan 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 RandomPlacementAttribute ke butiran.

Penempatan lokal

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

Penempatan berbasis hash

Lakukan hash pada id grain ke bilangan bulat non-negatif dan modulo hasilnya 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 HashBasedPlacementAttribute ke sebutir butiran.

Penempatan berdasarkan jumlah aktivasi

Strategi penempatan ini berniat untuk menempatkan aktivasi grain baru di server yang paling sedikit bebannya berdasarkan jumlah grain 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 Kekuatan Dua Pilihan dalam Penyeimbangan Beban Acak oleh Michael David Mitzenmacher, dan juga digunakan dalam Nginx untuk penyeimbangan beban terdistribusi, seperti yang dijelaskan dalam artikel NGINX dan "Power of Two Choices" Load-Balancing Algoritma.

Strategi penempatan ini dikonfigurasi dengan menambahkan ActivationCountBasedPlacementAttribute ke butiran.

Penempatan pekerja tanpa status

Penempatan pekerja tanpa status adalah strategi penempatan khusus yang digunakan oleh pekerja tanpa status biji-bijian. Penempatan ini beroperasi hampir identik dengan PreferLocalPlacement, kecuali bahwa setiap server dapat memiliki beberapa aktivasi dari butir yang sama dan butir tersebut tidak terdaftar dalam direktori butir karena tidak diperlukan.

Strategi penempatan ini dikonfigurasi dengan menambahkan StatelessWorkerAttribute pada butiran.

Penempatan berbasis peran terisolasi

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

Penempatan sumber daya yang dioptimalkan

Strategi penempatan yang dioptimalkan untuk sumber daya mencoba mengoptimalkan sumber daya kluster dengan menyeimbangkan aktivasi butiran di seluruh silo berdasarkan memori dan penggunaan CPU yang tersedia. Ini menetapkan bobot pada statistik waktu berjalan untuk memprioritaskan sumber daya yang berbeda-beda dan menghitung skor yang dinormalisasi untuk setiap silo. Silo yang memiliki skor terendah dipilih untuk menempatkan aktivasi yang akan dilakukan. Normalisasi memastikan bahwa setiap properti berkontribusi secara proporsional terhadap skor keseluruhan. Penyesuaian bobot dapat dilakukan melalui ResourceOptimizedPlacementOptions sesuai persyaratan dan prioritas khusus pengguna untuk sumber daya berbeda.

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

Selain itu, algoritma online, adaptif memberikan efek penghalusan yang menghindari penurunan sinyal cepat dengan mengubahnya menjadi proses peluruhan 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 ResourceOptimizedPlacementAttribute pada butiran.

Memilih strategi penempatan

Memilih strategi penempatan grain yang sesuai, di luar default yang Orleans berikan, 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 Hukum Bilangan Besar, jadi biasanya pilihan default yang baik ketika ada beban yang tidak dapat diprediksi yang tersebar di sejumlah besar butir (lebih dari 10.000).

Penempatan berbasis jumlah aktivasi juga mengandung elemen acak, bergantung pada prinsip Power of Two Choices, yang adalah algoritma yang umum digunakan untuk penyeimbangan beban terdistribusi dan digunakan dalam penyeimbang beban yang populer. Silo sering menerbitkan statistik waktu berjalan ke silo lain di 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 Orleans Anda.

Mengonfigurasi strategi penempatan default

Orleans akan menggunakan penempatan acak kecuali jika pengaturan default diubah. 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 antarmuka IPlacementDirector, membutuhkan satu metode. Dalam contoh ini, kami berasumsi Anda memiliki fungsi GetSiloNumber yang didefinisikan yang akan mengembalikan angka silo berdasarkan Guid dari butir 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.AddPlacementDirector<SamplePlacementStrategy, SamplePlacementStrategyFixedSiloDirector>();
}

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