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
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 |