リアルタイム通信を実装する際、WebSocketとSSE(Server-Sent Events)のどちらを選ぶか迷う場面が多くあります。本記事では、両者の違いと、用途別の選び方をわかりやすく解説します。
WebSocketとSSEの基本
- WebSocket:双方向のフルデュプレックス通信。クライアント・サーバーの双方が好きなタイミングで送信できる
- SSE:サーバー→クライアントの単方向ストリーミング。HTTPベースで実装がシンプル
項目別比較
通信方向
- WebSocket:双方向
- SSE:サーバー→クライアントのみ
プロトコル
- WebSocket:HTTPでアップグレード後、独自のwsプロトコル
- SSE:通常のHTTP/1.1, HTTP/2を維持
再接続
- WebSocket:再接続は自分で実装
- SSE:ブラウザが自動で再接続(
retry:フィールドで間隔制御可)
負荷とスケール
- WebSocket:ステートフルな常時接続。スケール設計時にスティッキーセッションが必要
- SSE:HTTPのキープアライブのみ。CDN・ロードバランサと相性が良い
シンプルな実装例
WebSocket(ブラウザ)
const ws = new WebSocket('wss://example.com/chat');
ws.onmessage = (e) => console.log(e.data);
ws.send(JSON.stringify({ type: 'msg', body: 'hello' }));
SSE(ブラウザ)
const es = new EventSource('/events');
es.onmessage = (e) => console.log(e.data);
SSE(サーバー / Node.js)
app.get('/events', (req, res) => {
res.set({ 'Content-Type': 'text/event-stream', 'Cache-Control': 'no-cache' });
setInterval(() => res.write(`data: ${Date.now()}\n\n`), 1000);
});
用途別の選び方
- WebSocketを選ぶ:チャット、対戦ゲーム、共同編集、リアルタイムバリデーション
- SSEを選ぶ:通知、ライブ更新(株価・スコア)、AIストリーミングレスポンス、ログテール
近年はLLM応答のストリーミングでSSEの採用が再増加しています。OpenAIやAnthropicのAPIもSSE形式でトークンを送ってきます。
代替案:WebTransport
HTTP/3ベースの新仕様WebTransportは、UDPの特性を活かして低遅延・多重ストリームを実現します。WebSocketの将来的な代替候補として注目されていますが、現時点ではブラウザ対応・運用知見ともに発展途上です。
まとめ
WebSocketとSSEは「双方向 or 単方向」がもっとも明確な分かれ目です。サーバー→クライアントの一方向で済むならSSE、双方向が必要ならWebSocketを基本軸に、運用のしやすさ・スケール要件と相談して選びましょう。