WebSocketとSSEの違い|リアルタイム通信の選び方

Web開発

リアルタイム通信を実装する際、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を基本軸に、運用のしやすさ・スケール要件と相談して選びましょう。