次の方法で共有


ZooKeeperBasedMembershipTable クラス

定義

Apache Zookeeper 3.4.6 を使用したメンバーシップ テーブルの実装 https://zookeeper.apache.org/doc/r3.4.6/

public class ZooKeeperBasedMembershipTable : Orleans.IMembershipTable
type ZooKeeperBasedMembershipTable = class
    interface IMembershipTable
Public Class ZooKeeperBasedMembershipTable
Implements IMembershipTable
継承
ZooKeeperBasedMembershipTable
実装

注釈

使用される ZK 機能の簡単な概要: データはノードのツリー (ファイル システムと同様) で表されます。 すべてのノードはパスによってアドレス指定され、データをバイト配列として保持でき、バージョンがあります。 ノードが作成されると、そのバージョンは 0 になります。 更新時に、バージョンはアトミックにインクリメントされます。 更新プログラムは、予想される現在のバージョンで条件付きにすることもできます。 トランザクションには、成功または失敗する複数の操作をアトミックに保持できます。 zookeeper クライアントを作成するときに、すべての操作が相対的なベース パスを設定できます。

この実装では、すべての Orleans デプロイにノード /UniqueDeploymentId があります。すべてのサイロの状態は /UniqueDeploymentId/IP:Port@Gen すべてのサイロの IAmAlive が /UniqueDeploymentId/IP:Port@Gen/IAmAlive IAmAlive に保存されます。更新は無条件であるため、別のノードに保存されます。

ノードの ZK バージョンは ETag です。テーブル のバージョンは /UniqueDeploymentId のバージョンであり、サイロ エントリ のバージョンは /UniqueDeploymentId/IP:Port@Gen

コンストラクター

ZooKeeperBasedMembershipTable(ILogger<ZooKeeperBasedMembershipTable>, IOptions<ZooKeeperClusteringSiloOptions>, IOptions<ClusterOptions>)

Apache Zookeeper 3.4.6 を使用したメンバーシップ テーブルの実装 https://zookeeper.apache.org/doc/r3.4.6/

メソッド

CleanupDefunctSiloEntries(DateTimeOffset)

Apache Zookeeper 3.4.6 を使用したメンバーシップ テーブルの実装 https://zookeeper.apache.org/doc/r3.4.6/

DeleteMembershipTableEntries(String)

指定された clusterId のすべてのテーブル エントリを削除します

InitializeMembershipTable(Boolean)

ZooKeeper ベースのメンバーシップ テーブルを初期化します。

InsertRow(MembershipEntry, TableVersion)

1 つのサイロに対して新しい MembershipEntry をアトミックに挿入 (追加) し、TableVersion も更新しようとします。 操作が成功すると、テーブルに対して次の変更が行われます。

  1. 新しい MembershipEntry がテーブルに追加されます。
  2. 新しく追加された MembershipEntry も、自動的に生成された新しい一意の eTag と共に追加されます。
  3. テーブル内の TableVersion.Version は、新しい TableVersion.Version に更新されます。
  4. テーブル内の TableVersion etag は、自動的に生成された新しい一意の eTag に更新されます。 テーブルに対するすべての変更、新しい行の挿入、テーブル バージョンと関連する etag の更新は、アトミックに行われるか、副作用なしでアトミックに失敗する必要があります。 操作は、次の各条件で失敗する必要があります。
  5. 特定のサイロの MembershipEntry がテーブルに既に存在する
  6. 指定された TableVersion etag (TableVersion.VersionEtag プロパティで指定) がテーブル内の TableVersion etag と一致しなかったため、TableVersion の更新に失敗しました。
ReadAll()

メンバーシップ テーブルの完全な内容をアトミックに読み取ります。 返される MembershipTableData には、テーブル内のすべてのサイロのすべての MembershipEntry エントリと、このテーブルの TableVersion が含まれます。 MembershipEntries と TableVersion はアトミックに読み取る必要があります。

ReadRow(SiloAddress)

特定のサイロに関するメンバーシップ テーブル情報をアトミックに読み取ります。 返される MembershipTableData には、特定のサイロに対して 1 つの MembershipEntry エントリと、このテーブルの TableVersion が含まれます。 MembershipEntry と TableVersion はアトミックに読み取る必要があります。

UpdateIAmAlive(MembershipEntry)

このサイロの MembershipEntry の IAmAlive パーツ (列) を更新します。 この操作では、IAmAlive 列のみを更新し、他の列を変更しないでください。 この操作は"ダーティ書き込み" または "インプレース更新" であり、etag 検証なしで実行されます。 eTag の更新に関して: この操作では、指定されたサイロ行に関連付けられている eTag が自動的に更新される可能性がありますが、更新する必要はありません。 また、etag を変更しないようにすることもできます ("ダーティライト")。 TableVersion に関して: この操作では、テーブルの TableVersion を変更しないでください。 それは手つかずのままにする必要があります。 テーブルの意味上の理由により、この操作が失敗する可能性があるシナリオはありません。 ネットワークの問題またはテーブルが使用できないことが原因でのみ失敗する可能性があります。

UpdateRow(MembershipEntry, String, TableVersion)

1 つのサイロの MembershipEntry をアトミックに更新し、TableVersion も更新しようとします。 操作が成功すると、テーブルに対して次の変更が行われます。

  1. このサイロの MembershipEntry は、新しい MembershipEntry に更新されます (古いエントリは新しいエントリによって完全に置き換えられる)
  2. 更新された MembershipEntry の eTag も、新しい一意に自動的に生成された eTag を持つ eTag になります。
  3. テーブル内の TableVersion.Version は、新しい TableVersion.Version に更新されます。
  4. テーブル内の TableVersion etag は、自動的に生成された新しい一意の eTag に更新されます。 テーブルに対するすべての変更、新しい行の更新、テーブル バージョンと関連する etag の更新は、アトミックに行われるか、副作用なしでアトミックに失敗する必要があります。 操作は、次の各条件で失敗する必要があります。
  5. 特定のサイロの MembershipEntry がテーブルに存在しない
  6. 特定のサイロの MembershipEntry がテーブルに存在しますが、テーブル内の etag が指定された etag と一致しません。
  7. 指定された TableVersion etag (TableVersion.VersionEtag プロパティで指定) がテーブル内の TableVersion etag と一致しなかったため、TableVersion の更新に失敗しました。

適用対象