Websocket
WebSocket
WebSocketとは、接続を保ちながらクライアントとサーバーの両方からメッセージを送れる通信方式です。チャットや共同編集などに使われます。リアルタイム通知の選択肢の一つで、用途によってSSEやポーリングも使い分けます。
🐾 猫で例えると?
体を寄せて眠る2匹を、つながりを保つイメージに使います。ここで、つながっている間はどちらからも合図を送れると考えると、WebSocketの双方向通信に近づきます。密着していれば必ず情報が届くという意味ではありません。実際のアプリでは接続断や再接続、失った通知をどう扱うかも設計します。
💻 IT現場における「Websocket」とは?
HTTPも持続的接続を使えるため、応答のたびに必ず接続が切れるわけではありません。また、HTTPがステートレス(前のやり取りの状態を自動では引き継がない)であることと、接続の寿命は別の話です。WebSocketは、開いた接続上で双方が独立してメッセージを送れる点が特徴です。
HTTP/1.1を使う一般的な接続では、Upgradeという切り替えの合意をするやり取り(ハンドシェイク)を行い、WebSocketのメッセージ交換へ移ります。サーバーからも送信できるため、クライアントが毎回問い合わせなくても更新を通知できます。
⚠️ Websocketの仕組みと注意点
維持する接続数やメッセージ量に応じて資源を使いますが、常にCPUをフルに使うわけではありません。接続数だけでなく、遅い受信者へ送るデータがたまらないか、メッセージの上限は適切かも設計します。
JavaScriptでのWebsocket実装イメージ
次はWebSocket対応ブラウザーのコード断片です。wss://example.com/chatは説明用なので、動作確認には自分で用意したWebSocketエンドポイントへ置き換えます。
const socket = new WebSocket("wss://example.com/chat");
socket.addEventListener("open", () => {
socket.send("こんにちは、茶トラです");
});
socket.addEventListener("message", event => {
console.log("受信:", event.data);
});
socket.addEventListener("error", () => {
console.error("接続エラーを検知しました");
});
socket.addEventListener("close", event => {
console.log("切断:", event.code);
// この断片には自動再接続を含めていません
}); 再接続する場合は待ち時間と回数を制限し、切断中に受け取れなかった情報をどう補うかも決めます。接続が戻っただけで、未着メッセージが自動的に再送されるわけではありません。
🛠️ Websocketを賢く使うためのポイント
現場でWebsocketを採用・運用する際に、エンジニアが頭を悩ませる代表的なポイントとベストプラクティスです。
- 複数サーバーへの配信を設計する:利用者が別々のサーバーへ接続すると、メッセージを必要な相手へ届ける共有・配信の仕組みが必要です。接続を増設先へ移せるか、既存接続をどう閉じるかも確認します。
- 中継機器の接続条件を確認する:プロキシやロードバランサーが対応する方式、アイドルタイムアウト、接続上限を確認します。必要ならハートビートを設計し、不要な接続を残さないようにします。
- 暗号化と認証を組み合わせる:公開サービスでは通常wssを使います。ただしTLSだけで利用者の権限は判断できないため、認証、Originの確認、メッセージ内容の検証も必要です。
寄り添って眠る2匹のように接続を保てるWebSocketでも、切断は起こります。再接続時にどこから表示やデータをそろえるか、中継機器がいつ接続を切るかを確認しましょう。暗号化に加えて、接続する利用者の認証と送受信できる内容の制御も必要です。