Orleans 그레인은 활성화 및 비활성화가 순서대로 이루어지는 관찰할 수 있는 생명 주기를 사용합니다 (생명 주기를 참조). 이렇게 하면 곡물 활성화 및 수집 중에 조직 논리, 시스템 구성 요소 및 애플리케이션 논리가 순서대로 시작 및 중지될 수 있습니다.
단계
미리 정의된 곡물 수명 주기 단계는 다음과 같습니다.
public static class GrainLifecycleStage
{
public const int First = int.MinValue;
public const int SetupState = 1_000;
public const int Activate = 2_000;
public const int Last = int.MaxValue;
}
-
First
: 곡물 수명 주기의 첫 번째 단계입니다. -
SetupState
: 활성화하기 전에 곡물 상태를 설정합니다. 상태 저장 곡물의 경우 Orleans가 IStorage<TState>.State일 때 IStorage.RecordExists를 스토리지에서 로드하는 단계입니다. -
Activate
: Orleans가 Grain.OnActivateAsync 및 Grain.OnDeactivateAsync를 호출하는 단계. -
Last
: 곡물 수명 주기의 마지막 단계입니다.
곡물 활성화 중에 곡물 수명 주기를 사용하지만 Orleans 일부 오류 사례(예: 사일로 크래시)에서 곡물이 항상 비활성화되는 것은 아닙니다. 따라서 애플리케이션은 곡물 비활성화 중에 항상 실행되는 곡물 수명 주기에 의존해서는 안 됩니다.
곡물 수명 주기 참여
애플리케이션 논리는 다음 두 가지 방법으로 곡물의 수명 주기에 참여할 수 있습니다.
- 곡물은 자체 수명 주기에 참여할 수 있습니다.
- 구성 요소는 곡물 활성화 컨텍스트를 통해 수명 주기에 액세스할 수 있습니다(참조 IGrainContext.ObservableLifecycle).
- 곡물은 자체 수명 주기에 참여할 수 있습니다.
- 구성 요소는 곡물 활성화 컨텍스트를 통해 수명 주기에 액세스할 수 있습니다(참조 IGrainActivationContext.ObservableLifecycle).
곡물은 항상 수명 주기에 참여하므로 참여 메서드를 재정의하여 애플리케이션 논리를 도입할 수 있습니다.
참가 예제
public override void Participate(IGrainLifecycle lifecycle)
{
base.Participate(lifecycle);
lifecycle.Subscribe(
this.GetType().FullName,
GrainLifecycleStage.SetupState,
OnSetupState);
}
앞의 예제에서는 Grain<TGrainState>가 Grain.Participate 단계에서 수명 주기가 OnSetupState
메서드를 호출하도록 하기 위해 GrainLifecycleStage.SetupState 메서드를 재정의합니다.
또한 곡물 생성 중에 생성된 구성 요소는 특별한 곡물 논리를 추가하지 않고도 수명 주기에 참여할 수 있습니다. Orleans 곡물을 만들기 전에 해당 수명 주기()를 포함하여 곡물의 컨텍스트(IGrainContextIGrainContext.ObservableLifecycle)를 만들므로 컨테이너에 의해 곡물에 주입된 모든 구성 요소는 곡물의 수명 주기에 참여할 수 있습니다.
또한 곡물 생성 중에 생성된 구성 요소는 특별한 곡물 논리를 추가하지 않고도 수명 주기에 참여할 수 있습니다. Orleans 곡물의 활성화 컨텍스트(IGrainActivationContext수명 주기IGrainActivationContext.ObservableLifecycle 포함)를 만들기 때문에 곡물을 만들기 전에 컨테이너에 의해 곡물에 주입된 모든 구성 요소는 곡물의 수명 주기에 참여할 수 있습니다.
예: 구성 요소 참여
다음 구성 요소는 팩터리 함수 Create(...)
를 사용하여 만들 때 곡물의 수명 주기에 참여합니다. 이 논리는 구성 요소의 생성자에 존재할 수 있지만 구성 요소가 완전히 생성되기 전에 수명 주기에 구성 요소를 추가할 위험이 있으므로 안전하지 않을 수 있습니다.
public class MyComponent : ILifecycleParticipant<IGrainLifecycle>
{
public static MyComponent Create(IGrainContext context)
{
var component = new MyComponent();
component.Participate(context.ObservableLifecycle);
return component;
}
public void Participate(IGrainLifecycle lifecycle)
{
lifecycle.Subscribe<MyComponent>(GrainLifecycleStage.Activate, OnActivate);
}
private Task OnActivate(CancellationToken ct)
{
// Do stuff
}
}
public class MyComponent : ILifecycleParticipant<IGrainLifecycle>
{
public static MyComponent Create(IGrainActivationContext context)
{
var component = new MyComponent();
component.Participate(context.ObservableLifecycle);
return component;
}
public void Participate(IGrainLifecycle lifecycle)
{
lifecycle.Subscribe<MyComponent>(GrainLifecycleStage.Activate, OnActivate);
}
private Task OnActivate(CancellationToken ct)
{
// Do stuff
}
}
팩터리 함수를 사용하여 Create(...)
서비스 컨테이너에 예제 구성 요소를 등록하면 구성 요소를 종속성으로 사용하여 생성된 모든 곡물은 구성 요소가 곡물 자체에 특별한 논리를 요구하지 않고도 수명 주기에 참여하게 됩니다.
컨테이너에 구성 요소 등록
services.AddTransient<MyComponent>(sp =>
MyComponent.Create(sp.GetRequiredService<IGrainContext>());
services.AddTransient<MyComponent>(sp =>
MyComponent.Create(sp.GetRequiredService<IGrainActivationContext>());
구성 요소를 종속성으로 사용하는 곡물
public class MyGrain : Grain, IMyGrain
{
private readonly MyComponent _component;
public MyGrain(MyComponent component)
{
_component = component;
}
}
.NET