こう 聞かれます
- 「画面を
リアルタイムに 更新するには、 ポーリング、 SSE、 WebSocket を どう 選びますか」 - 「チャットの
機能を 作るなら、 どの 仕組みを 使いますか」 - 「AI の
答えが 1 文字ずつ 出てくる 画面は、 どう いう 仕組みで 作られていますか」 (知っている 範囲を 確かめる形)
面接官が 見ている点
- 「リアルタイムなら WebSocket」と
決めつけず、 データの 向きと 頻度から選べるか - つな
ぎっぱなしに すると、 切れた ときの つなぎ直しや、 サーバーの 台数を 増やすときに 手間が 増える、 と分かっているか - いちばん簡単な
ポーリングで 足りる 場面を 認められるか
短い答え
- サーバーからの
知らせが 少なく、 数秒の 遅れで よいなら ポーリング、 サーバーから 画面への 一方向で 足りるなら SSE、 画面と サーバーが 互いに 頻繁に 送り合うなら WebSocket を 選びます。 - 右へ
行く ほど 遅れは 小さくなりますが、 つな ぎっぱなしの 接続を 抱えるので、 切れた ときの 手当てやサーバーの 作りが 重くなります。 - たとえば、
通知の 数を 出す 画面なら ポーリング、 LLM の 答えを 少しずつ出す 画面なら SSE、 チャットや 共同編集なら WebSocket、のように 分けます。
少し 詳しい答え
3 つのやり方
- ポーリング画面が
決まった 間隔で 「新しい物はありますか」と ふつうの HTTP で 聞きに 行きます。 作りは いちばん簡単で、 今の サーバーの ままで 動きます。 そのかわり、 間隔の ぶん 遅れ、 何も 無い ときの 問い 合わせも 無駄に増えます - SSE (Server-Sent Events) 画面が 1 本の HTTP の
接続を 開けたままにし、 サーバーが そこへ 知らせを 流し続けます。 ブラウザは EventSourceで受け、 応答の 型は text/event-streamです。切れたら、 ブラウザが 既定で 自動で つなぎ直します。 向きは サーバーから 画面への 一方向だけで、 画面から 送る ときは ふつうの HTTP の 要求を 別に使います - WebSocket 最初は HTTP の
要求で 「WebSocket に 切り替えたい」と 頼み (Upgrade)、 サーバーが 101 で 応じた あとは、 同じ接続の 上で 両方向に いつでも 送れます。 これは HTTP/1.1 で 始める 場合の 手順で、 HTTP/2 や HTTP/3 の 上で WebSocket を 使う 決まりも あり、 その 場合は 始め方が 違います (TCP その ものの 話は 別の 問いに 渡します)。 暗号つきの wssと、暗号なしの wsがあります
http
GET /chat HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade(HTTP/1.1 で
選び方の目安
決め手は
- 知らせが
数分に 1 回で、 少しの 遅れが 困らない → ポーリング - サーバーから
画面へ 流すだけ (進み具合、 通知、 LLM の 答えを 少しずつ出す) → SSE。 LLM の 答えを 少しずつ 画面に 出す仕組みにも よく 使われます - 画面からも
頻繁に 送る (チャット、 共同編集、 対戦の ゲーム) → WebSocket
SSE には
つな ぎっぱなしの弱点
SSE と WebSocket は
- 切れた
ときの手当て スマホが 電波の 悪い 所に 入れば 接続は 切れます。 WebSocket では つなぎ直しを 自分で 作り、 切れていた間の 知らせを 取り直す方 法 (最後に 受けた 番号を 送って 続きを もらう、 など ) も決めます - 認証と順番 WebSocket では、
誰の 接続かの 確かめや、 知らせの 順番を どう 扱うかを、 アプリの 側で 約束として 決めて作ります - サーバーの
台数を 増やすとき 接続は ある 1 台に つながっています。 ほかの 台が 受けた 知らせを、 その接続を 持つ台へ 届ける 仕組み (台の 間で 知らせを 配る 中継) が 要ります。 ロードバランサーが 長い接続を 途中で 切らない 設定かも 確かめます
だから、
自分が
よく ある間違い
- 「リアルタイムなら
必ず WebSocket」と言う 一方向で 足りるなら SSE の ほうが 作りも 運用も 軽く、 遅れてよいなら ポーリングで 十分な こともあります - 切れた
ときの ことを考えないつなぎ直しと、 切れていた間の 取り こぼしを どう 埋めるかを 決めて おかないと、 知らせが抜けます - サーバーを 1 台の
前提で作る 台数を 増やした 途端に、 別の 台に つながった 人へ 知らせが 届かなくなります
深掘りの問い
- 「WebSocket の
接続は、 どう 認証しますか」 つなぐ ときに、 ふつうの HTTP と 同じ方 法 (クッキーや トークン) で 誰かを 確かめ、 確かめられなければ つなが せない、と答えます - 「サーバーを
何台にも 増やしたら、 知らせは どう 届けますか」 台の 間で 知らせを 配る 中継を 置き、 接続を 持っている 台が それを 受けて 送る、と答えます - 「SSE で、
画面から サーバーへ 送りたくなったら」 送る 分は ふつうの HTTP の 要求で 送り、 受ける 分だけ SSE を 使う、と答えます