コンテンツにスキップ

プロセスグループ

プロセスグループを使用すると、プロセスが名前付きグループに参加してグループ宛てのブロードキャストを受信できます。メンバーシップはクラスタ内のすべてのノードをまたいで追跡されます。モデルは Erlang/OTP pg に従います: グループは初回参加時に作成され、プロセスは複数のグループに所属でき(同じグループに複数回参加することも可能)、メンバーシップは分散管理されます — 各ノードが自身の状態を維持し、ノード間メッシュを通じてピアと調整します。

Lua API はプロセスグループに記載されています。このページはスコープエントリ種別とその設定を扱います。メンバーシップモデル全体についてはクラスタガイドを参照。

種別説明
pg.scope独自のメンバーシップ状態とクラスタメッシュを持つ独立したプロセスグループ名前空間

各スコープは分離されています: 1つのスコープのグループとメンバーは別のスコープからは見えません。プロセスはエントリIDでスコープを開き(pg.open("app:pg"))、その中で操作します。

- name: pg
kind: pg.scope
lifecycle:
auto_start: true

すべてのフィールドはオプションで、典型的なクラスタ向けにチューニングされたデフォルト値を持ちます。

フィールドデフォルト説明
protocol_timeoutduration5sノード間の同期/探索操作のタイムアウト
broadcast_timeoutduration5s単一メンバーへのブロードキャスト配信のタイムアウト
anti_entropy_intervalduration30s調整ループの間隔。1ティックごとに1つのピアを同期(0で無効)
circuit_breaker_failuresint3回路が開くまでのノードへの連続送信失敗回数
circuit_breaker_reset_timeduration10s開いた回路がテスト送信のためにハーフオープンに移行するまでの待機時間
max_retriesint3失敗したブロードキャストのリトライ試行回数(0でリトライ無効)
retry_base_delayduration100msリトライ間の初期バックオフ遅延
retry_max_delayduration1s最大バックオフ遅延
action_queue_sizeint256”容量に近づいています” 警告がログに記録される深さ
action_queue_max_sizeint1024内部イベントループキューのハード容量。満杯の場合は操作がドロップされる
monitor_bufferint64サブスクリプションごとのイベントチャネル容量。バッファが満杯のサブスクライバーにはイベントがドロップ
max_groupsint0最大グループ数(0 = 無制限)
max_members_per_groupint0グループごとの最大メンバー数(マルチ参加を含む)(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>)は、スコープが長期間ブロードキャストトラフィックを受信しない場合に異常を報告し、ブロックされたイベントループや永続的なパーティションを検出します。可観測性ガイドを参照。