Bagikan melalui


Orleans gambaran umum siklus hidup silo

Orleans silo menggunakan siklus hidup yang dapat diamati untuk startup dan pematian sistem yang dipesan Orleans , serta komponen lapisan aplikasi. Untuk informasi selengkapnya tentang detail implementasi, lihat Orleans siklus hidup.

Tahap

Orleans klien silo dan kluster menggunakan serangkaian tahap siklus hidup layanan umum.

public static class ServiceLifecycleStage
{
    public const int First = int.MinValue;
    public const int RuntimeInitialize = 2_000;
    public const int RuntimeServices = 4_000;
    public const int RuntimeStorageServices = 6_000;
    public const int RuntimeGrainServices = 8_000;
    public const int ApplicationServices = 10_000;
    public const int BecomeActive = Active - 1;
    public const int Active = 20_000;
    public const int Last = int.MaxValue;
}

Pencatatan

Karena inversi kontrol, di mana peserta bergabung dengan siklus hidup daripada siklus hidup yang memiliki beberapa serangkaian langkah inisialisasi terpusat, tidak selalu jelas dari kode apa urutan startup/shutdown. Untuk membantu mengatasi hal ini, pengelogan telah ditambahkan sebelum startup silo untuk melaporkan komponen apa yang berpartisipasi di setiap tahap. Log ini dicatat di tingkat log Informasi pada pencatat Orleans.Runtime.SiloLifecycleSubject . Contohnya:

Information, Orleans.Runtime.SiloLifecycleSubject, "Stage 2000: Orleans.Statistics.PerfCounterEnvironmentStatistics, Orleans.Runtime.InsideRuntimeClient, Orleans.Runtime.Silo"

Information, Orleans.Runtime.SiloLifecycleSubject, "Stage 4000: Orleans.Runtime.Silo"

Information, Orleans.Runtime.SiloLifecycleSubject, "Stage 10000: Orleans.Runtime.Versions.GrainVersionStore, Orleans.Storage.AzureTableGrainStorage-Default, Orleans.Storage.AzureTableGrainStorage-PubSubStore"

Selain itu, waktu dan informasi kesalahan juga dicatat untuk setiap komponen berdasarkan tahap. Contohnya:

Information, Orleans.Runtime.SiloLifecycleSubject, "Lifecycle observer Orleans.Runtime.InsideRuntimeClient started in stage 2000 which took 33 Milliseconds."

Information, Orleans.Runtime.SiloLifecycleSubject, "Lifecycle observer Orleans.Statistics.PerfCounterEnvironmentStatistics started in stage 2000 which took 17 Milliseconds."

Partisipasi siklus hidup silo

Logika aplikasi dapat mengambil bagian dalam siklus hidup silo dengan mendaftarkan layanan yang berpartisipasi dalam kontainer layanan silo. Layanan harus terdaftar sebagai ILifecycleParticipant<TLifecycleObservable> di mana T adalah ISiloLifecycle.

public interface ISiloLifecycle : ILifecycleObservable
{
}

public interface ILifecycleParticipant<TLifecycleObservable>
    where TLifecycleObservable : ILifecycleObservable
{
    void Participate(TLifecycleObservable lifecycle);
}

Ketika silo dimulai, semua peserta (ILifecycleParticipant<ISiloLifecycle>) dalam kontainer akan diizinkan untuk berpartisipasi dengan memanggil perilaku mereka ILifecycleParticipant<TLifecycleObservable>.Participate . Setelah semua memiliki kesempatan untuk berpartisipasi, siklus hidup silo yang dapat diamati akan memulai semua tahapan secara berurutan.

Contoh

Dengan pengenalan siklus hidup silo, penyedia bootstrap, yang digunakan untuk memungkinkan pengembang aplikasi menyuntikkan logika pada fase inisialisasi penyedia, tidak lagi diperlukan, karena logika aplikasi sekarang dapat disuntikkan pada tahap startup silo apa pun. Meskipun demikian, kami menambahkan fasad 'tugas startup' untuk membantu transisi bagi pengembang yang telah menggunakan penyedia bootstrap. Sebagai contoh bagaimana komponen dapat dikembangkan yang mengambil bagian dalam siklus hidup silo, kita akan melihat fasad tugas startup.

Tugas startup hanya perlu mewarisi dari ILifecycleParticipant<ISiloLifecycle> dan berlangganan logika aplikasi ke siklus hidup silo pada tahap yang ditentukan.

class StartupTask : ILifecycleParticipant<ISiloLifecycle>
{
    private readonly IServiceProvider _serviceProvider;
    private readonly Func<IServiceProvider, CancellationToken, Task> _startupTask;
    private readonly int _stage;

    public StartupTask(
        IServiceProvider serviceProvider,
        Func<IServiceProvider, CancellationToken, Task> startupTask,
        int stage)
    {
        _serviceProvider = serviceProvider;
        _startupTask = startupTask;
        _stage = stage;
    }

    public void Participate(ISiloLifecycle lifecycle)
    {
        lifecycle.Subscribe<StartupTask>(
            _stage,
            cancellation => _startupTask(_serviceProvider, cancellation));
    }
}

Dari implementasi di atas, kita dapat melihat bahwa dalam Participate(...) panggilan itu berlangganan siklus hidup silo pada tahap yang dikonfigurasi, meneruskan panggilan balik aplikasi daripada logika inisialisasinya. Komponen yang perlu diinisialisasi pada tahap tertentu akan memberikan panggilan balik mereka, tetapi polanya sama. Sekarang setelah kita memiliki StartupTask yang akan memastikan bahwa kait aplikasi dipanggil pada tahap yang dikonfigurasi, kita perlu memastikan bahwa StartupTask berpartisipasi dalam siklus hidup silo.

Untuk ini, kita hanya perlu mendaftarkannya dalam kontainer. Kami melakukan ini dengan fungsi ekstensi pada ISiloHostBuilder:

public static ISiloHostBuilder AddStartupTask(
    this ISiloHostBuilder builder,
    Func<IServiceProvider, CancellationToken, Task> startupTask,
    int stage = ServiceLifecycleStage.Active)
{
    builder.ConfigureServices(services =>
        services.AddTransient<ILifecycleParticipant<ISiloLifecycle>>(
            serviceProvider =>
                new StartupTask(
                    serviceProvider, startupTask, stage)));

    return builder;
}

Dengan mendaftarkan StartupTask dalam kontainer layanan silo sebagai antarmuka ILifecycleParticipant<ISiloLifecycle>penanda , ini memberi sinyal ke silo yang perlu diambil komponen ini dalam siklus hidup silo.