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 を呼び出すポーリング (最もシンプル) がある。
適するユースケース
- ダッシュボードのリアルタイム更新
- ビルド/デプロイのログストリーミング
- 株価・為替のティッカー
- 通知フィード
実務での活用方法は関連書籍にも詳しい。