ロングポーリング (long polling) は、クライアントが問い合わせると、更新が出るまでサーバーが応答を保留し、更新が出た時点で返す 方式です。
通常の ポーリング (定期ポーリング) が 更新がなくても即座に空のレスポンスを返す のに対し、更新が出るまで待つ ことで無駄な空振りを減らします。
まず押さえたいポイント
- 更新が出るまでサーバーが応答を保留するため、
準リアルタイムに近い反映ができる - 更新がないときの
空振りレスポンスを大幅に減らせる - リクエスト数は減るが、
接続を長く掴むため別の負荷がかかる - タイムアウトと再接続の設計が必要になる
通常のポーリングとの違い
定期ポーリング— 聞かれたら即座に今の状態を返す。実装は簡単だが空振りが多いロングポーリング— 更新が出るまで待ってから返す。空振りは減るが接続管理が必要
「定期ポーリングでは遅すぎる、でも WebSocket は重い」という中間を埋める選択肢として使われます。
動きの流れ
- クライアントがサーバーへ問い合わせる
- 更新がなければ、サーバーは即座に返さず接続を保留する
- 更新が発生したら、その内容を応答として返す
- 一定時間(タイムアウト)更新がなければ、空の応答を返していったん区切る
- クライアントは応答を受け取ったら、すぐ次の問い合わせを始める
この 待ってから返す 一手間によって、定期ポーリングのような 更新なし の空振り応答を大きく減らせます。
よくある場面と注意点
AWS の Amazon SQS でも、空のレスポンスを減らしてコストと無駄な取得を抑える目的でロングポーリングが推奨されています。チャットの簡易実装や、WebSocket を使えない環境での準リアルタイム更新でも使われてきました。
注意点は、多数の接続を保留したまま抱えるため、リバースプロキシやロードバランサーの タイムアウト設定 とぶつかりやすいことです。プロキシ側のタイムアウトより保留時間を短く設計し、接続が切れたら再接続する作りにする必要があります。また、サーバーが多数の接続を同時に保持するため、1 接続あたりのメモリやスレッドの使い方 も確認しておくと安全です。
よくある誤解
ロングポーリングがあれば WebSocket は要らない ではありません。ロングポーリングはサーバーからの通知を擬似的に実現する手段で、双方向に頻繁なやり取りが必要ならやはり WebSocket が向きます。定期ポーリングでは遅い、でも WebSocket は重い という中間を埋める選択肢として捉えると、役割が分かりやすくなります。
詳しくは ポーリングとは?更新の取り方とロングポーリング・SSE・WebSocket・Webhookの使い分け で、他方式との使い分けを整理しています。