【さーばーせんといべんつ】

Server-Sent Events とは?

💡 サーバーから「一方通行」でリアルタイムにデータを送る
📌 このページのポイント
Server-Sent Events(SSE) クライアント サーバー HTTP リクエスト(接続確立) コネクション維持(text/event-stream) data: {"price": 150.2} data: {"price": 151.8} data: {"price": 149.5} ← サーバーからの一方向ストリーム HTTPベースのシンプルなリアルタイム通信。自動再接続機能付き
Server-Sent Events の一方向ストリームイメージ
ひよこ ひよこ

WebSocketと何が違うの?

ペンギン先生 ペンギン先生

WebSocketは双方向通信(サーバー↔クライアント)。SSEはサーバー→クライアントの一方向。SSEはHTTP上で動くからプロキシファイアウォールの問題が少なく、自動再接続機能も標準装備。チャットのような双方向が必要ならWebSocket通知やリアルタイム更新ならSSEがシンプルでおすすめだよ

ひよこ ひよこ

どうやって使うの?

ペンギン先生 ペンギン先生

クライアント側はconst source = new EventSource('/api/events'); source.onmessage = (e) => console.log(e.data);だけ。サーバー側はContent-Type: text/event-streamでdata: メッセージ\n\nを送り続ける。レスポンスを閉じずに保持するだけだから、どんなバックエンド言語でも簡単に実装できるよ

ひよこ ひよこ

AIのストリーミング応答もSSE?

ペンギン先生 ペンギン先生

そう!ChatGPTClaude APIのストリーミングレスポンスはSSEを使っている。1トークンずつ生成されるテキストをリアルタイムにクライアントに送信する。data: {"text": "こん"}\ndata: {"text": "にち"}\nのように。チャットUIで文字が1文字ずつ表示されるのはSSEのおかげなんだよ

ひよこ ひよこ

制限はある?

ペンギン先生 ペンギン先生

①一方向のみ(クライアントからサーバーへは通常のHTTPリクエストが必要)、②テキストデータのみ(バイナリ不可)、③ブラウザの同一ドメイン同時接続数制限(HTTP/1.1で6本)。HTTP/2なら接続を多重化できるから制限が緩和される。IE非対応だけど、2024年のモダンブラウザは全対応しているよ

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「Server-Sent Events」って出てきたら「サーバーからリアルタイムにデータを送る軽量なWeb技術」と思えればだいたいOK!
📖 おまけ:英語の意味
「Server-Sent Events」 = サーバー送信イベント
💬 Server(サーバー)がSend(送る)Events(イベント)。HTMLの標準仕様に含まれるよ
← 用語集にもどる