다음을 통해 공유


Orleans 수명 주기 개요

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

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

관찰 가능한 수명 주기

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

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

예시

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

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