画面をリアルタイムに更新するには、ポーリング、SSE、WebSocket をどう選びますか

新しい情報を画面に届ける 3 つのやり方を、向き (一方向か双方向か)、手間、つなぎっぱなしの重さで比べて選ぶ問い。切れたときの手当てと、台数を増やすときの注意まで答えます。

答えてみる

面接官に「画面をリアルタイムに更新するには、ポーリング、SSE、WebSocket をどう選びますか」と聞かれたつもりで、答えを見る前に自分の言葉で答えます。

声に出して答えた人は「書かずに答えを見る」で開けます。

解説を読む

聞かれ方から関連するコースまで、この問いの解説を全部ここに置いています。

こう聞かれます

  • 「画面をリアルタイムに更新するには、ポーリング、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 には数の限りがあります。HTTP/2 を使わないときは、ブラウザごと、ドメインごとに同時につなげる数が 6 本までです。タブを何枚も開くと足りなくなることがあるので、HTTP/2 で配るか、1 本にまとめる工夫をします。

つなぎっぱなしの弱点

SSE と WebSocket は遅れが小さいかわりに、次の手間を引き受けます。

  • 切れたときの手当てスマホが電波の悪い所に入れば接続は切れます。WebSocket ではつなぎ直しを自分で作り、切れていた間の知らせを取り直す方法 (最後に受けた番号を送って続きをもらう、など) も決めます
  • 認証と順番 WebSocket では、誰の接続かの確かめや、知らせの順番をどう扱うかを、アプリの側で約束として決めて作ります
  • サーバーの台数を増やすとき 接続はある 1 台につながっています。ほかの台が受けた知らせを、その接続を持つ台へ届ける仕組み (台の間で知らせを配る中継) が要ります。ロードバランサーが長い接続を途中で切らない設定かも確かめます

だから、要件が「数秒遅れてよい」なら、まずポーリングで出し、遅れや問い合わせの量が問題になってから SSE や WebSocket に移る、という順も十分に良い選択です。

自分が関わったサービスで、どの仕組みを選び、なぜほかを選ばなかったかを 1 つ用意して話すと伝わります。架空の例なら「注文の進み具合を出す画面は、サーバーから流すだけなので SSE にし、つなぎ直しはブラウザに任せた」のように話せます。

よくある間違い

  • 「リアルタイムなら必ず WebSocket」と言う一方向で足りるなら SSE のほうが作りも運用も軽く、遅れてよいならポーリングで十分なこともあります
  • 切れたときのことを考えないつなぎ直しと、切れていた間の取りこぼしをどう埋めるかを決めておかないと、知らせが抜けます
  • サーバーを 1 台の前提で作る 台数を増やした途端に、別の台につながった人へ知らせが届かなくなります

深掘りの問い

  • 「WebSocket の接続は、どう認証しますか」 つなぐときに、ふつうの HTTP と同じ方法 (クッキーやトークン) で誰かを確かめ、確かめられなければつながせない、と答えます
  • 「サーバーを何台にも増やしたら、知らせはどう届けますか」 台の間で知らせを配る中継を置き、接続を持っている台がそれを受けて送る、と答えます
  • 「SSE で、画面からサーバーへ送りたくなったら」送る分はふつうの HTTP の要求で送り、受ける分だけ SSE を使う、と答えます

確認日 2026年10月24日

技術面接問題の一覧へ戻る