조직 수명 주기 개요

Orleans 노이즈는 순서가 지정된 활성화 및 비활성화를 위해 관찰 가능한 수명 주기( 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: 정품 인증 전에 노이즈 상태를 설정합니다. 상태 저장 노이즈의 경우 IStorage.RecordExists(이)가 true일 때 IStorage<TState>.State(이)가 스토리지에서 로드되는 단계입니다.
  • Activate: Grain.OnActivateAsyncGrain.OnDeactivateAsync(이)가 호출되는 스테이지입니다.
  • Last: 노이즈 수명 주기의 마지막 단계입니다.

조직 수명 주기는 조직 활성화 중에 사용되지만, 일부 오류 사례(예: 사일로 크래시) 중에는 조직이 항상 비활성화되는 것은 아니므로, 애플리케이션은 조직 비활성화 중에 항상 실행되는 조직 수명 주기에 의존해서는 안 됩니다.

조직 수명 주기 참여

애플리케이션 논리는 다음 두 가지 방법으로 조직의 수명 주기에 참여할 수 있습니다.

  • 노이즈는 수명 주기에 참여할 수 있습니다.
  • 구성 요소는 조직 활성화 컨텍스트를 통해 수명 주기에 액세스할 수 있습니다(IGrainContext.ObservableLifecycle 참조).
  • 노이즈는 수명 주기에 참여할 수 있습니다.
  • 구성 요소는 조직 활성화 컨텍스트를 통해 수명 주기에 액세스할 수 있습니다(IGrainActivationContext.ObservableLifecycle 참조).

조직은 항상 해당 수명 주기에 참여하므로 참여 메서드를 재정의하여 애플리케이션 논리를 도입할 수 있습니다.

참여 예제

public override void Participate(IGrainLifecycle lifecycle)
{
    base.Participate(lifecycle);
    lifecycle.Subscribe(
        this.GetType().FullName,
        GrainLifecycleStage.SetupState,
        OnSetupState);
}

위의 예제에서 Grain<TGrainState>는 수명 주기의 GrainLifecycleStage.SetupState 단계에서 OnSetupState 메서드를 호출하도록 수명 주기에 지시하는 Grain.Participate 메서드를 재정의합니다.

노이즈 생성 중에 생성된 구성 요소는 특별한 노이즈 논리를 추가하지 않고도 수명 주기에도 참여할 수 있습니다. 노이즈의 수명 주기(IGrainContext.ObservableLifecycle)를 포함한 노이즈의 활성화 컨텍스트(IGrainContext)는 노이즈가 생성되기 전에 생성되므로 컨테이너에 의해 노이즈에 주입된 모든 구성 요소는 노이즈의 수명 주기에 참여할 수 있습니다.

노이즈 생성 중에 생성된 구성 요소는 특별한 노이즈 논리를 추가하지 않고도 수명 주기에도 참여할 수 있습니다. 조직의 수명 주기(IGrainActivationContext.ObservableLifecycle)를 포함한 조직의 활성화 컨텍스트(IGrainActivationContext)는 조직이 생성되기 전에 생성되므로 컨테이너에 의해 조직에 주입된 모든 구성 요소는 조직의 수명 주기에 참여할 수 있습니다.

참여, 생성 및 활성화 예제

다음 구성 요소는 팩터리 함수 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;
    }
}