일부 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.OnStart와 ILifecycleObserver.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));
}
}
.NET