Orleans 수명 주기 개요

일부 Orleans 동작은 순서가 지정된 시작 및 종료가 필요할 정도로 충분히 복잡합니다. 이러한 동작이 있는 일부 구성 요소에는 조직, 사일로 및 클라이언트가 포함됩니다. 이 문제를 해결하기 위해 일반적인 구성 요소 수명 주기 패턴이 도입되었습니다. 이 패턴은 구성 요소의 시작 및 종료 단계에서 신호를 전송하는 관찰 가능한 수명 주기와 특정 단계에서 시작 또는 종료 작업을 수행하는 수명 주기 관찰자로 구성됩니다.

자세한 내용은 조직 수명 주기사일로 수명 주기를 참조하세요.

관찰 가능한 수명 주기

순서가 지정된 시작 및 종료가 필요한 구성 요소는 관찰 가능한 수명 주기를 사용하여 다른 구성 요소가 수명 주기를 관찰하고 시작 또는 종료 중에 단계에 도달하면 알림을 받을 수 있도록 합니다.

public interface ILifecycleObservable
{
    IDisposable Subscribe(
        string observerName,
        int stage,
        ILifecycleObserver observer);
}

구독 호출은 시작 또는 중지하는 동안 단계에 도달하면 알림을 위해 관찰자를 등록합니다. 관찰자의 이름은 보고 목적으로 사용됩니다. 시작/종료 시퀀스에서 관찰자에게 통지할 시점을 나타내는 단계입니다. 수명 주기의 각 단계를 관찰할 수 있습니다. 시작 및 중지 시 단계에 도달하면 모든 관찰자에게 알림이 표시됩니다. 단계는 오름차순으로 시작되고 내림차순으로 중지됩니다. 관찰자는 반환된 삭제 가능 파일을 삭제하여 구독을 취소할 수 있습니다.

수명 주기 관찰자

다른 구성 요소의 수명 주기에 참여해야 하는 구성 요소는 시작 및 종료 동작에 대한 후크를 제공하고 관찰 가능한 수명 주기의 특정 단계를 구독해야 합니다.

public interface ILifecycleObserver
{
    Task OnStart(CancellationToken ct);
    Task OnStop(CancellationToken ct);
}

ILifecycleObserver.OnStartILifecycleObserver.OnStop 모두 시작/종료 중에 구독한 단계에 도달할 때 호출됩니다.

유틸리티

편의를 위해 일반적인 수명 주기 사용 패턴에 대한 도우미 함수가 만들어졌습니다.

확장

구독 구성 요소가 ILifecycleObserver를 구현할 필요가 없는 관찰 가능한 수명 주기를 구독하기 위한 확장 함수가 있습니다. 대신, 이것들은 구성 요소가 람다를 통과하거나 멤버 함수를 구독된 단계에서 호출할 수 있게 허용합니다.

IDisposable Subscribe(
    this ILifecycleObservable observable,
    string observerName,
    int stage,
    Func<CancellationToken, Task> onStart,
    Func<CancellationToken, Task> onStop);

IDisposable Subscribe(
    this ILifecycleObservable observable,
    string observerName,
    int stage,
    Func<CancellationToken, Task> onStart);

유사한 확장 함수를 사용하면 관찰자 이름 대신 제네릭 형식 인수를 사용할 수 있습니다.

IDisposable Subscribe<TObserver>(
    this ILifecycleObservable observable,
    int stage,
    Func<CancellationToken, Task> onStart,
    Func<CancellationToken, Task> onStop);

IDisposable Subscribe<TObserver>(
    this ILifecycleObservable observable,
    int stage,
    Func<CancellationToken, Task> onStart);

수명 주기 참여

일부 확장성 지점에는 수명 주기에 참여하는 데 관심이 있는 구성 요소를 인식하는 방법이 필요합니다. 이 목적을 위해 수명 주기 참가자 마커 인터페이스가 도입되었습니다. 사일로 및 조직 수명 주기를 탐색할 때 이를 사용하는 방법에 대해 자세히 알아봅니다.

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

예시

수명 주기 테스트에서 아래는 수명 주기의 여러 단계에서 관찰 가능한 수명 주기에 참여하는 구성 요소의 예제입니다.

enum TestStages
{
    Down,
    Initialize,
    Configure,
    Run,
};

class MultiStageObserver : ILifecycleParticipant<ILifecycleObservable>
{
    public Dictionary<TestStages,bool> Started { get; } = new();
    public Dictionary<TestStages, bool> Stopped { get; } = new();

    private Task OnStartStage(TestStages stage)
    {
        Started[stage] = true;

        return Task.CompletedTask;
    }

    private Task OnStopStage(TestStages stage)
    {
        Stopped[stage] = true;

        return Task.CompletedTask;
    }

    public void Participate(ILifecycleObservable lifecycle)
    {
        lifecycle.Subscribe<MultiStageObserver>(
            (int)TestStages.Down,
            _ => OnStartStage(TestStages.Down),
            _ => OnStopStage(TestStages.Down));

        lifecycle.Subscribe<MultiStageObserver>(
            (int)TestStages.Initialize,
            _ => OnStartStage(TestStages.Initialize),
            _ => OnStopStage(TestStages.Initialize));

        lifecycle.Subscribe<MultiStageObserver>(
            (int)TestStages.Configure,
            _ => OnStartStage(TestStages.Configure),
            _ => OnStopStage(TestStages.Configure));

        lifecycle.Subscribe<MultiStageObserver>(
            (int)TestStages.Run,
            _ => OnStartStage(TestStages.Run),
            _ => OnStopStage(TestStages.Run));
    }
}