プロセスグループ

プロセスグループを使用すると、プロセスが名前付きグループに参加してグループ宛てのブロードキャストを受信できます。メンバーシップはクラスタ内のすべてのノードをまたいで追跡されます。モデルは 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>)は、スコープが長期間ブロードキャストトラフィックを受信しない場合に異常を報告し、ブロックされたイベントループや永続的なパーティションを検出します。可観測性ガイドを参照。

関連項目