SSE

サーバーからクライアントへ一方向のリアルタイムデータストリームを HTTP で送信する仕組み

Webリアルタイム

SSE とは

SSE (Server-Sent Events) は、サーバーからクライアントへ一方向のリアルタイムデータストリームを HTTP で送信する仕組みである。WebSocket と異なり HTTP/1.1 上で動作し、サーバーからの一方向通知に特化している。詳細は「Server-Sent Events」の用語を参照。

WebSocket との比較

観点 SSE WebSocket
方向 サーバー → クライアント (一方向) 双方向
プロトコル HTTP/1.1 ws:// (独自プロトコル)
自動再接続 ブラウザが自動で再接続 自前で実装
バイナリデータ 非対応 (テキストのみ) 対応
適するケース 通知、ログ、株価 チャット、ゲーム

クライアント側

const source = new EventSource('/api/notifications');

source.onmessage = (event) => {
  const data = JSON.parse(event.data);
  console.log('Received:', data);
};

source.onerror = () => {
  console.log('Connection lost, auto-reconnecting...');
};

サーバー側

// Express での SSE
app.get('/api/notifications', (req, res) => {
  res.setHeader('Content-Type', 'text/event-stream');
  res.setHeader('Cache-Control', 'no-cache');
  res.setHeader('Connection', 'keep-alive');

  const send = (data: unknown) => {
    res.write(`data: ${JSON.stringify(data)}\n\n`);
  };

  send({ type: 'connected' });

  const interval = setInterval(() => {
    send({ type: 'heartbeat', timestamp: Date.now() });
  }, 30000);

  req.on('close', () => clearInterval(interval));
});

Lambda + API Gateway での SSE

Lambda は長時間接続を維持できないため、SSE には不向き。代替手段として、AppSync (GraphQL Subscriptions) による WebSocket ベースのリアルタイム通知、IoT Core + MQTT による軽量なリアルタイム通信、API Gateway WebSocket による Lambda との統合、定期的に API を呼び出すポーリング (最もシンプル) がある。

適するユースケース

  • ダッシュボードのリアルタイム更新
  • ビルド/デプロイのログストリーミング
  • 株価・為替のティッカー
  • 通知フィード

実務での活用方法は関連書籍にも詳しい。

関連用語