WebSocket とは? 永続的な双方向接続
WebSocket は、HTTP handshake の後も開いたままになる長寿命の接続で、クライアントとサーバーが互いにいつでもメッセージを送れるようにします。
素の HTTP はリクエスト・レスポンス型です。クライアントが尋ね、サーバーが答えます。WebSocket は、接続を upgrade して双方がいつでもメッセージを送れるようにすることで、このパターンを打ち破ります。ライブの build ログ、デプロイの進捗ストリーム、リロードなしで更新されるダッシュボードは、しばしば WebSocket を使用します。
upgrade handshake
WebSocket は、Upgrade ヘッダーを持つ HTTP リクエストとして始まります。サーバーが同意すると、接続はプロトコルを切り替え、1 つのレスポンスの後に閉じるのではなく、双方向チャネルとして開いたままになります。
全二重メッセージング
いったん開くと、どちらの側も polling なしで独立してメッセージを送れます。これは、サーバーがプッシュすべき更新を持つリアルタイムデータに理想的です。
CI/CD で登場する場面
- build やデプロイのログを UI へライブストリーミングする。
- ダッシュボード上のリアルタイムな job ステータス。
- 実行中の container にアタッチされたインタラクティブなコンソール。
接続は切断される
長寿命の接続は本質的に脆弱です。proxy の timeout、ネットワークの不具合、アイドル期間がそれらを断ち切ることがあります。堅牢なクライアントは自動的に再接続し、中断したところから再開します。
proxy と load balancer
すべての proxy や load balancer がデフォルトで WebSocket の upgrade を転送するわけではありません。サービスの前に新しい proxy を配置するデプロイは、通常の HTTP が依然として動作していても、WebSocket トラフィックを暗黙のうちに壊すことがあります。
パイプラインでの一時的な切断
長いデプロイ中にログストリームが切断されるのは、build の失敗ではなく一時的な不具合です。Latchkey では、runner 側の streaming が短時間のネットワーク中断を越えて再接続するため、一瞬の切断がログを断ち切ったり job を失敗させたりすることはありません。
重要なポイント
- WebSocket は、HTTP 接続を永続的な双方向チャネルに upgrade します。
- ライブのログストリーミングやステータスダッシュボードのようなリアルタイム機能を可能にします。
- 接続は不具合や proxy の timeout で切断されるため、クライアントは再接続すべきです。