Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Orleans silolar, sistemlerin ve uygulama katmanı bileşenlerinin sıralı olarak başlatılması ve kapatılması Orleans 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şama
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;
}
- ServiceLifecycleStage.First: Hizmetin yaşam döngüsünün ilk aşaması.
- ServiceLifecycleStage.RuntimeInitialize: Silonun iş parçacığı oluşturma işlemini başlatdığı çalışma zamanı ortamının başlatılması.
- ServiceLifecycleStage.RuntimeServices: Silonun ağ ve çeşitli aracıları başlattığı çalışma zamanı hizmetlerinin başlangıcı.
- ServiceLifecycleStage.RuntimeStorageServices: Çalışma zamanı depolamasının başlatılması.
- ServiceLifecycleStage.RuntimeGrainServices: Tahıllar için çalışma zamanı hizmetlerinin başlatılması. Bu, tahıl türü yönetimini, üyelik hizmetini ve tahıl dizinini içerir.
- ServiceLifecycleStage.ApplicationServices: Uygulama katmanı hizmetleri.
- ServiceLifecycleStage.BecomeActive: Silo kümeye katılır.
- ServiceLifecycleStage.Active: Silo kümede etkindir ve iş yükünü kabul etmeye hazırdır.
- ServiceLifecycleStage.Last: Hizmetin yaşam döngüsünün son aşaması.
Ağaç kesimi
Merkezi bir başlatma adımları kümesine sahip olan yaşam döngüsü yerine katılımcıların 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 Orleans, silo başlatmadan önce günlüğe kaydetmeyi ekler ve her aşamada hangi bileşenlerin katıldığını rapor eder. Bu günlükler günlükçü üzerinde 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, her Orleans bileşen için zamanlama ve hata bilgilerini safhalara göre günlüğe kaydeder. Ö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üne katılım
Uygulama mantığınız, silonun hizmet kapsayıcısında katılımcı bir hizmeti kaydederek silonun yaşam döngüsüne katılabilir. Hizmeti bir ILifecycleParticipant<TLifecycleObservable> olarak kaydedin, burada T
bir ISiloLifecycle'dir.
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 (ILifecycleParticipant<ISiloLifecycle>
) davranışları çağrıldığında katılım sağlayabilir. Hepsi katılma fırsatına sahip olduktan sonra silonun gözlemlenebilir yaşam döngüsü tüm aşamaları sırayla başlatır.
Örnek
Silo yaşam döngüsünün kullanıma sunulmasıyla birlikte, daha önce sağlayıcı başlatma aşamasında mantık eklemenize izin veren bootstrap sağlayıcıları artık gerekli değildir. Artık silo başlatmanın herhangi bir aşamasında uygulama mantığı ekleyebilirsiniz. Bununla birlikte, bootstrap sağlayıcılarını kullanan geliştiricilerin geçişine yardımcı olmak için bir 'başlangıç görevi' ara yüzü ekledik. Silonun yaşam döngüsüne katılan bileşenleri nasıl geliştirebileceğinizi gösteren bir örnek olarak başlangıç görev cephesine göz atalım.
Başlangıç görevinin yalnızca ILifecycleParticipant<ISiloLifecycle>
'den devralması ve uygulama mantığını belirtilen aşamada silo yaşam döngüsüne abone etmesi 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));
}
}
Önceki uygulama örneğinden, Participate(...)
çağrısında yapılandırılmış aşamada silo yaşam döngüsüne abone olunurken başlatma mantığı yerine uygulama geri çağrısı geçirildiğini görebilirsiniz. Belirli bir aşamada başlatılması gereken bileşenler geri çağrılarını verir, ancak temel yapı aynı kalıyor. Şimdi bir StartupTask
sayesinde uygulamanın kancasının yapılandırılan aşamada çağrıldığından emin olduğunuza göre, StartupTask
'in silo yaşam döngüsüne katıldığından emin olmanız gerekir.
Bunun için yalnızca konteyner içine kaydetmeniz gerekir. Bunu ISiloHostBuilder üzerinde bir uzantı işlevi kullanarak yapın.
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;
}
Silo'nun hizmet kapsayıcısına StartupTask
'yu, işaret ara yüzü olan ILifecycleParticipant<ISiloLifecycle>
olarak kaydederek, bu bileşenin silo yaşam döngüsüne katılması gerektiğini siloya bildirirsiniz.