Orleans 사일로 수명 주기 개요

Orleans 사일로는 애플리케이션 계층 구성 요소뿐만 아니라 Orleans 시스템의 시작 및 종료 순서에 대해 관찰 가능한 수명 주기를 사용합니다. 구현 세부 사항에 대한 자세한 내용은 Orleans 수명 주기를 참조하세요.

스테이지

Orleans 사일로 및 클러스터 클라이언트는 일반적인 서비스 수명 주기 단계 세트를 사용합니다.

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

로깅

참가자가 일부 중앙 집중식 초기화 단계 세트가 있는 수명 주기가 아닌 수명 주기에 참여하는 제어 반전으로 인해 시작/종료 순서가 코드에서 항상 명확하지는 않습니다. 이 문제를 해결하기 위해 각 단계에서 참여하는 구성 요소를 보고하기 위해 사일로 시작 전에 로깅이 추가되었습니다. 이러한 로그는 Orleans.Runtime.SiloLifecycleSubject 로거의 정보 로그 수준에 기록됩니다. 예를 들면 다음과 같습니다.

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"

또한 타이밍 및 오류 정보는 단계별로 각 구성 요소에 대해 유사하게 기록됩니다. 예를 들면 다음과 같습니다.

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

사일로 수명 주기 참여

애플리케이션 논리는 사일로의 서비스 컨테이너에 참여하는 서비스를 등록하여 사일로의 수명 주기에 참여할 수 있습니다. 서비스를 TISiloLifecycleILifecycleParticipant<TLifecycleObservable>로 등록해야 합니다.

public interface ISiloLifecycle : ILifecycleObservable
{
}

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

사일로가 시작되면 컨테이너의 모든 참가자(ILifecycleParticipant<ISiloLifecycle>)는 해당 ILifecycleParticipant<TLifecycleObservable>.Participate 동작을 호출하여 참여할 수 있습니다. 모두가 참여할 기회가 있으면 사일로의 관찰 가능한 수명 주기가 모든 단계를 순서대로 시작합니다.

예시

사일로 수명 주기가 도입되면서 애플리케이션 개발자가 공급자 초기화 단계에서 논리를 삽입할 수 있도록 하는 데 사용되는 부트스트랩 공급자는 이제 사일로 시작의 모든 단계에서 애플리케이션 논리를 주입할 수 있으므로 더 이상 필요하지 않습니다. 그럼에도 불구하고 부트스트랩 공급자를 사용했던 개발자의 전환을 돕기 위해 ‘시작 작업’ 외관을 추가했습니다. 사일로의 수명 주기에 참여하는 구성 요소를 개발하는 방법의 예제로 시작 작업 외관을 살펴보겠습니다.

시작 작업은 ILifecycleParticipant<ISiloLifecycle>에서 상속하고 지정된 단계에서 애플리케이션 논리를 사일로 수명 주기로 구독하기만 하면 됩니다.

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

위의 구현을 통해 Participate(...) 호출에서 초기화 논리가 아닌 애플리케이션 콜백을 전달하면서 구성된 단계에서 사일로 수명 주기에 가입한다는 것을 알 수 있습니다. 지정된 단계에서 초기화해야 하는 구성 요소는 콜백을 제공하지만 패턴은 동일합니다. 이제 구성된 단계에서 애플리케이션의 후크를 호출할 수 있는 StartupTask가 있으므로 StartupTask가 사일로 수명 주기에 참여하도록 해야 합니다.

이를 위해서는 컨테이너에 등록하기만 하면 됩니다. 다음과 같이 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;
}

사일로의 서비스 컨테이너에 StartupTask를 표식 인터페이스 ILifecycleParticipant<ISiloLifecycle>로 등록하면 이 구성 요소가 사일로 수명 주기에 참여해야 한다는 신호가 사일로에 표시됩니다.