次の方法で共有


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 の両方は、起動/シャットダウン中にサブスクライブされたステージに到達したときに呼び出されます。

Utilities

便宜上、一般的なライフサイクルの使用パターン用にヘルパー関数が作成されています。

拡張機能

監視可能なライフサイクルをサブスクライブするための拡張関数が存在します。これにより、サブスクライブ コンポーネントで 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));
    }
}