WebSocket イベントハブとテレメトリのスケーリング
Cockpit は、リアルタイムのイベント配信ハブを利用して、運用イベントとテレメトリの更新をクライアントブラウザにストリーミングします。このアーキテクチャにより、クライアント側からのポーリングを行うことなく、即座の UI 同期が可能になります。
イベントルーティングアーキテクチャ
イベントハブは、クライアント接続に WebSocket を使用し、ノード間通信に PostgreSQL の非同期通知を使用します。
- アップストリーム WebSocket ストリーミング: クライアントは
/api/v1/eventsエンドポイントへの永続的な WebSocket 接続を確立します。このリンクは開いたまま維持され、サーバーがブラウザに直接イベントをプッシュできるようにします。 - ノード間ルーティング (
pg_notify): マルチインスタンスの Cockpit デプロイメントでは、クライアントが異なるノードに接続する場合があります。Cockpit インスタンス A に接続されている Vapor ホストで状態変更が発生すると、そのインスタンスはイベントをデータベースに書き込み、PostgreSQL のpg_notifyチャネルを呼び出します。同じチャネルを監視している Cockpit インスタンス B は、通知を受信し、ローカルに接続されている WebSocket クライアントにそれをプッシュします。
┌──────────────┐ WebSocket ┌──────────────┐ pg_notify ┌──────────────┐ WebSocket ┌──────────┐
│ Vapor Host │───────────────►│ Cockpit #1 │───────────────►│ Cockpit #2 │───────────────►│ Browser │
│ (Physical │ │ (Active Node)│ │ (Active Node)│ │ Client │
│ Server) │ └──────────────┘ └──────────────┘ └──────────┘
└──────────────┘メッセージフレーム構造
WebSocket インターフェースを介して交換されるすべてのイベントは、標準化された JSON スキーマを使用してフレーム化されます。
json
{
"type": "<message_type>",
"payload": {
"kind": "<channel_name>",
"data": { ... }
}
}クライアント要求タイプ
auth: セッションを認証するために JSON Web Token (JWT) 資格情報を送信します。subscribe: 特定のイベントチャネルからの更新を受信するためにクライアントセッションを登録します。unsubscribe: イベントチャネルからクライアントセッションの登録を解除します。
サーバー応答タイプ
auth: 認証ステータスを確認します。event: サブスクライブされたイベントチャネルに関連付けられたペイロードを配信します。error: 要求エラー (トークンの有効期限切れや権限エラーなど) を示します。
サポートされているイベントチャネル
メトリクスまたはイベントの更新を受信するために、クライアントブラウザは特定のチャネルをサブスクライブします。
| チャネル名 | 説明 |
|---|---|
host-metrics:<host_id> | リアルタイムのホストレベルの CPU、メモリ、およびディスク I/O メトリクスをストリーミングします。 |
vm-events:<host_id> | 特定のホストの仮想マシンライフサイクル更新 (VM の起動、シャットダウン、またはクラッシュイベントなど) をブロードキャストします。 |
vm-metrics:<host_id> | 指定されたホストで実行されているすべての仮想マシンの、統合されたパフォーマンスチャートをストリーミングします。 |
vm-volume-migration-events:<uuid>:<disk> | アクティブなストレージ移行プロセスの進行状況インジケーター (0% 〜 100%) をストリーミングします。 |
task-events | システムバックグラウンド操作 (VM バックアップ作成、テンプレート作成、ホスト同期など) のステータス更新をブロードキャストします。 |