Skip to content
Latchkey

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 で切断されるため、クライアントは再接続すべきです。

関連ガイド