次の方法で共有


アクティブ化コレクション

この記事の対象: ✔️ Orleans 7.x 以降のバージョン

この記事の適用対象: ✔️ Orleans 3.x 以前のバージョン

グレイン アクティブ化は、Orleans ランタイムがグレインの一時的な物理的な実施形態として必要に応じて自動的に作成するグレイン クラスのメモリ内インスタンスです。

アクティブ化コレクションは、メモリから未使用のグレイン アクティブ化を削除するプロセスです。 概念的には、.NET でのガベージ コレクションの動作に似ています。 ただし、アクティベーションの収集では、特定の粒子がアイドル状態にある期間のみを考慮します。 メモリ使用量は要因として考慮されません。

アクティブ化コレクションのしくみ

アクティベーションの集約の一般的なプロセスでは、サイロ内の Orleans ランタイムが、設定された期間(収集年齢制限)に未使用のグレインのアクティベーションを定期的にスキャンします。 グレイン アクティブ化は、それだけ長くアイドル状態になると、非アクティブ化されます。 非アクティブ化プロセスは、ランタイムがグレインの OnDeactivateAsync() メソッドを呼び出すことから始まり、すべてのサイロ データ構造からグレイン アクティブ化オブジェクトへの参照を削除することで完了し、.NET GC がメモリを再利用できるようにします。

その結果、アプリケーション コードに負荷をかけずに、最近使用したグレイン アクティブ化のみがメモリに残ります。 使用されなくなったアクティブ化は自動的に削除され、ランタイムは使用したシステム リソースを再利用します。

穀物活性化の収集で「活動」と見なされる条件:

  • メソッド呼び出しを受け取る。
  • アラームを受け取る。
  • ストリーミング経由でイベントを受け取る。

グレイン活性化収集における「アクティブ」とみなされないもの:

  • (別のグレインまたは Orleans クライアントへの) 呼び出しの実行。
  • タイマー イベント。
  • Orleans フレームワークに関係しない任意の I/O 操作または外部呼び出し。

コレクションの年齢制限

アイドル 状態のグレインのアクティブ化がコレクションの対象となる時間は、コレクションの有効期間と呼ばれます。 既定のコレクションの有効期間は 15 分ですが、グローバルまたは個々のグレイン クラスに対して変更できます。

アイドル 状態のグレインのアクティブ化がコレクションの対象となる時間は、コレクションの有効期間と呼ばれます。 既定のコレクション期間制限は 2 時間ですが、グローバルまたは個々のグレイン クラスに対して変更できます。

アクティブ化コレクションの明示的な制御

アクティブ化コレクションを遅延させる

グレイン のアクティブ化は、 DelayDeactivation メソッドを呼び出すことによって収集を遅らせることができます。

protected void DelayDeactivation(TimeSpan timeSpan)

この呼び出しにより、少なくとも指定された期間、このアクティブ化が非アクティブ化されないようにします。 構成で指定されたアクティブ化コレクションの設定よりも優先されますが、取り消されることはありません。 したがって、この呼び出しは、 アクティブ化コレクションの設定で指定されているものを超えて非アクティブ化を遅らせるために別のフックを提供します。 この呼び出しを使用してアクティブ化の収集を促進することはできません。

正の timeSpan 値は、"その時間だけこのアクティブ化のコレクションを抑止する" ことを意味します。

負の timeSpan 値は、"DelayDeactivation 呼び出しの以前の設定を取り消し、通常のアクティブ化コレクション設定に基づいてこのアクティブ化を動作させる" ことを意味します。

シナリオ:

  1. アクティブコレクション設定は10分の制限を指定しており、グレインはDelayDeactivation(TimeSpan.FromMinutes(20))を呼び出します。 これにより、アクティブ化が少なくとも 20 分間収集されません。

  2. アクティブコレクション設定は10分の制限を指定しており、グレインはDelayDeactivation(TimeSpan.FromMinutes(5))を呼び出します。 それ以上呼び出しが行われなかった場合、アクティブ化は 10 分後に収集されます。

  3. アクティブコレクション設定は10分の制限を指定しており、グレインはDelayDeactivation(TimeSpan.FromMinutes(5))を呼び出します。 7 分後、このグレインに対して別の呼び出しが到着します。 それ以上呼び出しが行われなかった場合、0 から 17 分後にアクティブ化が収集されます。

  4. アクティブコレクション設定は10分の制限を指定しており、グレインはDelayDeactivation(TimeSpan.FromMinutes(20))を呼び出します。 7 分後、このグレインに対して別の呼び出しが到着します。 それ以上呼び出しが行われなかった場合、0 から 20 分後にアクティブ化が収集されます。

DelayDeactivation では、指定した時間が経過する前にグレインのアクティブ化が非アクティブ化されない% は 100 個にはなりません。 一部の障害ケースでは、グレインが "早期" に非アクティブ化される可能性があります。 つまり、 DelayDeactivation、メモリ内のグレインのアクティブ化を永続的に、または特定のサイロに "ピン留め" する手段として使用することはできませんDelayDeactivation は、グレインの非アクティブ化と再アクティブ化が行われる際の全体的なコストを削減するのに役立つ単なる最適化メカニズムです。 ほとんどの場合、 DelayDeactivation をまったく使用する必要はありません。

アクティブ化コレクションを早める

グレイン アクティブ化では、次にアイドル状態になったときに、 DeactivateOnIdle() メソッドを呼び出して非アクティブ化するようにランタイムに指示することもできます。

protected void DeactivateOnIdle()

グレインアクティブ化は、現時点でメッセージを処理していない場合はアイドルと見なされます。 グレインがメッセージの処理中に DeactivateOnIdle を呼び出すと、現在のメッセージの処理が完了するとすぐに非アクティブ化されます。 グレインのキューに入っている要求がある場合は、次のアクティブ化に転送されます。

DeactivateOnIdle は、構成または DelayDeactivationで指定されたアクティブ化コレクションの設定よりも優先されます。

この設定は、呼び出された特定のグレインアクティブ化にのみ適用されます。このグレインの種類の他のアクティブ化には適用されません。

構成

GrainCollectionOptionsを使用してアクティブ化コレクションを構成する:

mySiloHostBuilder.Configure<GrainCollectionOptions>(options =>
{
    // Set the value of CollectionAge to 10 minutes for all grain
    options.CollectionAge = TimeSpan.FromMinutes(10);

    // Override the value of CollectionAge to 5 minutes for MyGrainImplementation
    options.ClassSpecificCollectionAge[typeof(MyGrainImplementation).FullName] =
        TimeSpan.FromMinutes(5);
})

キープ アライブ

グレインを無期限に維持するには、グレインの実装に Orleans.KeepAliveAttribute を適用します。 KeepAlive 属性は、アイドル状態のアクティブ化コレクターによるグレインの収集を回避するように Orleans ランタイムに指示します。 収集の回避は、頻繁に使用されるグレインに役立ちますが、次の呼び出し時に作成オーバーヘッドが発生しないように、維持する必要があります。

public interface IPlayerGrain : IGrainWithGuidKey
{
    Task<IGameGrain> GetCurrentGame();
    Task JoinGame(IGameGrain game);
    Task LeaveGame(IGameGrain game);
}

[KeepAlive]
public class PlayerGrain : Grain, IPlayerGrain
{
    private IGameGrain _currentGame;

    public Task<IGameGrain> GetCurrentGame()
    {
       return Task.FromResult(_currentGame);
    }

    public Task JoinGame(IGameGrain game)
    {
       // Omitted for brevity.

       return Task.CompletedTask;
    }

   public Task LeaveGame(IGameGrain game)
   {
       // Omitted for brevity.

       return Task.CompletedTask;
   }
}

上記のコードにより、アイドル状態のアクティブ化コレクターによる PlayerGrain の収集が回避されます。