負荷分散

広い意味での負荷分散は、Orleans ランタイムの柱の 1 つです。 分散すると、リソースの使用率が最大になり、ホットスポットが回避され、それによってパフォーマンスが向上し、弾力性にも役立つため、Orleans ランタイムは、すべてのものを分散させようとします。 Orleans での負荷分散は、複数の場所で適用されます。 次に示すのはランタイムによって分散が実行される場所の一覧ですが、これだけではありません。

  1. 既定のアクター配置戦略はランダムであり、新しいアクティブ化はサイロ間にランダムに配置されます。 その結果、配置が分散され、ほとんどのシナリオでホットスポットがなくなります。
  2. さらに高度な ActivationCountBasedPlacement では、すべてのサイロでアクティブ化の数を等しくすることが試みられるため、サイロ間にいっそう均等にアクティブ化が分散されます。 これは、弾力性のために特に重要です。
  3. グレイン ディレクトリ サービスは、分散ハッシュ テーブルを基にして構築されるため、本質的に分散されています。 ディレクトリ サービスによってグレインはアクティブ化にマップされ、各サイロはグローバル マッピング テーブルの一部を所有し、このテーブルはすべてのサイロ間が均等になるようグローバルにパーティション分割されます。 そのため、仮想バケットでは一貫してハッシュを使います。
  4. クライアントはすべてのゲートウェイに接続し、それらの間で均等になるように要求を分散させます。
  5. リマインダー サービスは、分散パーティション分割されたランタイム サービスです。 特定のリマインダーを提供するサイロの割り当ては、グレイン ディレクトリと同様に、一貫したハッシュによってすべてのサイロ間に分散されます。
  6. 1 つのサイロ内のパフォーマンス クリティカルなコンポーネントはパーティション分割されて、それらの間の作業は局所的に分散されます。 これにより、サイロのランタイムは使用できるすべての CPU コアを完全に利用でき、サイロ内のボトルネックは発生しません。 これは、すべてのローカル リソース (スレッド、ソケット、ディスパッチの責任、キューなどへの作業の割り当て) に適用されます。
  7. QueueBalancerBase は、永続化キューからイベントをプルする責任を、クラスター内のサイロ間に分散させます。

分散は、必ずしも局所性の喪失を意味するとは限りません。 良好な局所性を維持しながら、分散させることができます。 たとえば、分散がシャーディングやパーティション分割を意味する場合は、特定の論理タスクに対する責任をパーティション分割しながら、各パーティション内に局所性を維持できます。 これは、ローカルと分散の両方の均等化に適用されます。