個人的なメモ

Tomohiro Suzuki @hiro128_777 のブログです。Microsoft MVP for Developer Technologies 2017- 本ブログと所属組織の公式見解は関係ございません。

Orleans の 永続データオブジェクト

Orleans では、グレインの永続化とサイロのメンバーシップ管理用のテーブルとして、永続データオブジェクトを利用します。
 
Microsoft によってメンテされているグレインの永続化ストレージパッケージは以下です。

  • ADO.NET
  • Azure Blob Storage、Azure Table Storage、Azure CosmosDB などの Azure Storage
  • Amazon DynamoDB

 
learn.microsoft.com
 
Microsoft によってメンテされているサイロのメンバーシップ管理用テーブルのパッケージは以下です。

  • ADO.NET
  • Azure Blob Storage、Azure Table Storage、Azure CosmosDB などの Azure Storage
  • Amazon DynamoDB
  • Apache ZooKeeper
  • Consul IO

 
learn.microsoft.com
 
 

Azure Table Storage を使用した場合の実例

例として、グレインの永続化ストレージとして Azure Table Storage を使用した場合について見てみます。
「orleanspoc」という名前のストレージアカウントを作成し、下記のように接続文字列を指定してサイロを構成すると初回に自動的にテーブルが作成されます。
 
 

グレインの状態の永続化用テーブル OrleansGrainState の指定
.AddAzureTableGrainStorage(
    "PocStore",
    options => options.ConfigureTableServiceClient(connectionString)
)

 

サイロメンバーシップの管理用のテーブル OrleansSiloInstances の指定
.UseAzureStorageClustering(options => options.ConfigureTableServiceClient(connectionString))

 

 
 

グレインの状態の永続化用テーブル OrleansGrainState

レコードを確認すると以下のようになっています。
App Service にサイロをデプロイした時のレコードを確認して各項目について調べてみました。

列名 値のソース、形式 説明
PartitionKey [ClusterOption.ServiceID]_[グレイン名のプレフィックス]_[連番] 永続化したグレインを一意に特定するキー
RowKey PersistentStateAttribute.StateName グレインは複数の状態を持てる。グレインが保持している状態を特定するキー
Timestamp タイムスタンプ タイムスタンプ
Data
Data1
Data2
シリアライズかつバイナリ化されたグレインが保持している状態の実体
1列に収まらなければ、連番なし、1、2 … N のように複数列に格納される
シリアライズかつバイナリ化されているため直接レコードを見ても中身はわからない状態になっている
規定では Orleans.Storage.JsonGrainStorageSerializer が利用される
参考:Orleans でのシリアル化の概要 | Microsoft Learn

 
 

サイロメンバーシップの管理用のテーブル OrleansSiloInstances

レコードを確認すると以下のようになっています。
App Service にサイロをデプロイした時のレコードとソースコードなどを確認して各項目について調べてみました。
 

列名 値のソース、形式 説明
PartitionKey ClusterOption.ClusterId サイロとクライアントがメンバーシップテーブルでお互いを見つけるためのキー
RowKey [ConfigureEndpoints のパラメーター advertisedIP]
-[ConfigureEndpoints のパラメーター siloPort]
-[Generation]
advertisedIP:クラスタリングに使用される IP アドレス(サイロのエンドポイントの IP アドレス)
siloPort:サイロ間通信の際に当該のサイロが使用するポート(サイロのエンドポイントのポート)
Generation:(epoch)サイロインスタンスの世代。2022/1/1 00:00:00 (UTC) を0とした現時刻 (UTC) までの Tick 数
Timestamp タイムスタンプ タイムスタンプ
Address EndpointOptions.AdvertisedIPAddress クラスタリングに使用される IP アドレス
DeploymentId PartitionKey の値 Orleans 2.0以前は DeploymentId と呼ばれていた名残り
Generation 2022/1/1 00:00:00 (UTC) を0とした現時刻 (UTC) までの Tick 数 サイロインスタンスの世代。learn のドキュメントでは「epoch」と呼称されている
参考:Orleans でのクラスターの管理 | Microsoft Learn
HostName サイロの DNS ホスト名 Dns.GetHostName() と同じ結果となる。サイロの起動時に設定される
IAmAliveTime DateTimeOffset 当該のサイロが生きていることを最後に報告した日時
Orleans ランタイムによる死活診断やトラブルシューティング時に利用する
InstanceName 古いカラムのため未調査 後方互換性のために残されている古いカラム。
Port EndpointOptions.SiloPort サイロ間通信(silo-to-silo)の際に当該のサイロが使用するポート(サイロのエンドポイントのポート)規定値は 11111
ProxyPort EndpointOptions.GatewayPort サイロからクライアント(この文脈では REST API <-> Grain Call のフロントエンドのこと)への TCP ポート。サイロの起動時に設定される。規定値は 30000
RoleName 実行中のアセンブリの名前。
SiloName サイロ ホストが付けたサイロ名。サイロの起動時に設定。
StartTime DateTimeOffset サイロインスタンスのが起動した日時
Status サイロの状態 状態の詳細は右記を参照:SiloStatus 列挙型 (Orleans.Runtime) | Microsoft Learn
メンバーシッププロトコルで管理される。
SuspectingSilos [サイロの IPアドレス]-[サイロの Port]@Generation 当該のサイロが Active ではないことを疑っているサイロのリスト。メンバーシッププロトコルで管理される。
SuspectingTimes DateTimeOffset 当該のが Active ではないことに対する疑いが生じた日時
UpdateZone Azure Cloud Services では利用されていたが、App Service での利用状況は不明
MembershipVersion Int64 TableVersion の場合のみ、現在のメンバーシップ構成の最新バージョン。MembershipEntry の 場合は null