プロセスグループ
プロセスグループを使用すると、プロセスが名前付きグループに参加してグループ宛てのブロードキャストを受信できます。メンバーシップはクラスタ内のすべてのノードをまたいで追跡されます。モデルは Erlang/OTP pg に従います: グループは初回参加時に作成され、プロセスは複数のグループに所属でき(同じグループに複数回参加することも可能)、メンバーシップは分散管理されます — 各ノードが自身の状態を維持し、ノード間メッシュを通じてピアと調整します。
Lua API はプロセスグループに記載されています。このページはスコープエントリ種別とその設定を扱います。メンバーシップモデル全体についてはクラスタガイドを参照。
エントリ種別
| 種別 | 説明 |
|---|---|
pg.scope |
独自のメンバーシップ状態とクラスタメッシュを持つ独立したプロセスグループ名前空間 |
各スコープは分離されています: 1つのスコープのグループとメンバーは別のスコープからは見えません。プロセスはエントリIDでスコープを開き(pg.open("app:pg"))、その中で操作します。
- name: pg
kind: pg.scope
lifecycle:
auto_start: true
設定
すべてのフィールドはオプションで、典型的なクラスタ向けにチューニングされたデフォルト値を持ちます。
| フィールド | 型 | デフォルト | 説明 |
|---|---|---|---|
protocol_timeout |
duration | 5s | ノード間の同期/探索操作のタイムアウト |
broadcast_timeout |
duration | 5s | 単一メンバーへのブロードキャスト配信のタイムアウト |
anti_entropy_interval |
duration | 30s | 調整ループの間隔。1ティックごとに1つのピアを同期(0で無効) |
circuit_breaker_failures |
int | 3 | 回路が開くまでのノードへの連続送信失敗回数 |
circuit_breaker_reset_time |
duration | 10s | 開いた回路がテスト送信のためにハーフオープンに移行するまでの待機時間 |
max_retries |
int | 3 | 失敗したブロードキャストのリトライ試行回数(0でリトライ無効) |
retry_base_delay |
duration | 100ms | リトライ間の初期バックオフ遅延 |
retry_max_delay |
duration | 1s | 最大バックオフ遅延 |
action_queue_size |
int | 256 | "容量に近づいています" 警告がログに記録される深さ |
action_queue_max_size |
int | 1024 | 内部イベントループキューのハード容量。満杯の場合は操作がドロップされる |
monitor_buffer |
int | 64 | サブスクリプションごとのイベントチャネル容量。バッファが満杯のサブスクライバーにはイベントがドロップ |
max_groups |
int | 0 | 最大グループ数(0 = 無制限) |
max_members_per_group |
int | 0 | グループごとの最大メンバー数(マルチ参加を含む)(0 = 無制限) |
- name: pg
kind: pg.scope
anti_entropy_interval: 30s
circuit_breaker_failures: 3
max_members_per_group: 10000
lifecycle:
auto_start: true
動作の仕組み
シングルライター状態。 各スコープはシングルゴルーチンのイベントループ(gen_serverパターン)を実行します。すべての変更はそれを通じてシリアライズされます。メンバーとグループの読み取りはアトミックに公開されたスナップショットから提供されるため、ループをブロックしません。
参加/離脱の伝播。 ローカルの参加または離脱はループに適用され、ライブメンバーシップピアと以前に発見されたリモートノードの和集合にファンアウトされます。その和集合に送信することで、新しく参加した、またはまだ収束していないノードでも変更を確実に受信できます。
ブロードキャスト。 broadcast はループ内でクラスタ全体のメンバーリストのスナップショットを取得し、ループの外で各メンバーに配信します。これにより遅いレシピエントがスコープを停止させません。broadcast_local も同様ですが、ローカルノードのメンバーのみが対象です。
MonitorとEvents。 サブスクライブと現在のメンバーのスナップショット取得は1つのイベントループティックで行われるため、サブスクライバーはサブスクリプションと競合する変更を見逃したり二重カウントしたりしません。サブスクライバーは member.joined / member.left イベントを受信します。N回参加したプロセスの離脱はPIDをN回報告し、多重度を保持します。
アンチエントロピーと探索。 起動時にスコープは小さなランダムなサブセットのピアに探索メッセージを送ります(多数のノードが一度に再起動したときのN²ストームを避けるために制限されます)。ノードが参加すると、フル状態同期を受け取ります。アンチエントロピーループは定期的に一度に1つのピアにフル同期をプッシュするため、ピアが見逃したブロードキャストも最終的に収束します。レシーバーは差分同期を適用します — 実際に追加または削除されたメンバーのみがイベントを発行します。
サーキットブレーカー。 ノードごとのサーキットブレーカーが連続送信失敗を追跡します。circuit_breaker_failures 回の失敗後に開き、circuit_breaker_reset_time が経過するまでそのノードへの送信はスキップされます。その後1回のテスト送信が許可されます。開いたブレーカーに当たった参加/離脱ブロードキャストは max_retries まで指数バックオフでリトライされます。
オブザーバビリティ
ライブネスヘルスチェック(pg.broadcast_recent.<scope>)は、スコープが長期間ブロードキャストトラフィックを受信しない場合に異常を報告し、ブロックされたイベントループや永続的なパーティションを検出します。可観測性ガイドを参照。