Aracılığıyla paylaş


Orleans silo yaşam döngüsüne genel bakış

Orleans silolar, sistemlerin ve uygulama katmanı bileşenlerinin Orleans sıralı olarak başlatılması ve kapatılması için gözlemlenebilir bir yaşam döngüsü kullanır. Uygulama ayrıntıları hakkında daha fazla bilgi için bkz Orleans . yaşam döngüsü.

AŞAMALAR

Orleans silo ve küme istemcileri ortak bir hizmet yaşam döngüsü aşamaları kümesi kullanır.

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

Günlük Kaydı

Bazı merkezi başlatma adımlarına sahip olan katılımcıların yaşam döngüsü yerine yaşam döngüsüne katıldığı denetimin tersine çevrilmesi nedeniyle, başlatma/kapatma sırasının ne olduğu koddan her zaman net değildir. Bu sorunu gidermeye yardımcı olmak için silo başlatmadan önce günlük kaydı eklenerek her aşamada hangi bileşenlerin katıldığı bildirilir. Bu günlükler günlükçüdeki Bilgi günlüğü düzeyinde Orleans.Runtime.SiloLifecycleSubject kaydedilir. Örneğin:

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"

Ayrıca, zamanlama ve hata bilgileri her bileşen için aşamaya göre benzer şekilde günlüğe kaydedilir. Örneğin:

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."

Silo yaşam döngüsü katılımı

Uygulama mantığı, silonun hizmet kapsayıcısında katılımcı bir hizmeti kaydederek silonun yaşam döngüsünde yer alabilir. Hizmetin bir olduğu yerde T ISiloLifecycleolarak ILifecycleParticipant<TLifecycleObservable> kaydedilmesi gerekir.

public interface ISiloLifecycle : ILifecycleObservable
{
}

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

Silo başlatıldığında, kapsayıcıdaki tüm katılımcıların (ILifecycleParticipant<ISiloLifecycle>) davranışlarını çağırarak ILifecycleParticipant<TLifecycleObservable>.Participate katılmasına izin verilir. Hepsi katılma fırsatına sahip olduktan sonra silonun gözlemlenebilir yaşam döngüsü tüm aşamalara sırayla başlar.

Örnek

Silo yaşam döngüsünün kullanıma sunulmasıyla birlikte, uygulama geliştiricilerinin sağlayıcı başlatma aşamasında mantık eklemesine izin vermek için kullanılan bootstrap sağlayıcıları artık gerekli değildir, çünkü uygulama mantığı artık silo başlatmanın herhangi bir aşamasında eklenebilir. Bununla birlikte, bootstrap sağlayıcılarını kullanan geliştiricilerin geçişine yardımcı olmak için bir 'başlangıç görevi' cephesi ekledik. Silonun yaşam döngüsünde yer alan bileşenlerin nasıl geliştirilebileceğini gösteren bir örnek olarak başlangıç görev cephesine göz atacağız.

Başlangıç görevinin yalnızca belirtilen aşamada uygulama mantığını devralması ILifecycleParticipant<ISiloLifecycle> ve silo yaşam döngüsüne abone olması gerekir.

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

Yukarıdaki uygulamadan çağrısında Participate(...) , yapılandırılan aşamada silo yaşam döngüsüne abone olduğunu ve başlatma mantığı yerine uygulama geri çağırmasını geçirdiğini görebiliriz. Belirli bir aşamada başlatılması gereken bileşenler geri çağrılarını sağlayabilir, ancak desen aynıdır. Artık uygulamanın kancasının yapılandırılan aşamada çağrılmasını sağlayacak bir StartupTask örneğimiz olduğuna göre, silo yaşam döngüsüne katıldığından StartupTask emin olmamız gerekir.

Bunun için yalnızca kapsayıcıya kaydetmemiz gerekir. Bunu üzerinde ISiloHostBuilderbir uzantı işleviyle yaparız:

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

StartupTask'ı silonun hizmet kapsayıcısına işaret arabirimi ILifecycleParticipant<ISiloLifecycle>olarak kaydederek bu, siloya bu bileşenin silo yaşam döngüsünde yer alması gerektiğini bildirir.