Short Polling は、クライアントが定期的な間隔でHTTPリクエストを送信して更新データを受信する、クライアント・サーバー間の通信技術です。サーバーは各リクエストを即座に処理し、変更がなくても現在の状態を返します。Amazon Web Services、2024年によると、Short Pollingは実装が最も簡単ですが、最も効率の悪いポーリング方式であり、サーバーとネットワークに過剰な負荷をかけます。
重要なポイント
Short Polling は、クライアントが事前に定義された間隔でサーバーに定期的にHTTPリクエストを送信し、サーバーが各リクエストを同期的に処理して即座に結果を返す通信パターンです。ポーリング間隔はクライアント側でタイマーを使用して設定され、データの鮮度要件に応じて通常1〜60秒の範囲です。
Short Pollingは、Webアプリケーションでリアルタイム通信を実現する最初のメカニズムでした。2000年代初頭、第2世代のXMLHttpRequest以前は、Webページは<meta http-equiv="refresh">や定期的なiframeリロードを使用してコンテンツを更新していました。2005年のAJAX(Asynchronous JavaScript and XML)技術の登場により、Short Pollingはページ全体をリロードせずにデータを更新する標準的なアプローチになりました。
Short Polling のアーキテクチャは、クライアントタイマー、HTTPリクエスト、サーバーハンドラーの3つのコンポーネントで構成されます。クライアントがインターバルタイマーを開始し、タイマーが発火するたびにサーバーにGETリクエストが送信されます。サーバーはデータベースや他のソースにクエリを実行し、レスポンスを生成して即座にクライアントに返します。クライアントはインターフェースを更新し、次のタイマー発火を待ちます。このサイクルはアプリケーションがアクティブな間、無限に繰り返されます。
Short Polling の主な問題は、避けられない空リクエストです。データの変更が稀な場合、ほとんどのリクエストは「変更なし」の結果を返し、ネットワーク帯域幅とCPU処理時間を浪費します。ポーリング間隔5秒で10,000のクライアントがいる場合、サーバーは毎秒2,000のリクエストを受信しますが、更新頻度が1分間に1イベントの場合、その大部分は無駄になります。
Short Polling はシンプルなサイクルで動作します:クライアントが一定期間(例:5000ms)のインターバルタイマーを設定します。タイマーが発火するたびに、クライアントはサーバーエンドポイントにHTTP GETリクエストを生成します。通常は最後の更新のタイムスタンプパラメーターが付与されます。サーバーはリクエストを受信し、指定されたタイムスタンプ以降の新しいデータを確認して、新しいデータがある場合はそれを、ない場合は更新がないことを示すレスポンスを返します。
Short Polling の設定における重要なパラメーターはポーリング間隔です。間隔が短すぎると(3秒未満)、サーバーとネットワークに高い負荷がかかります。長すぎると(30秒超)、データの鮮度が低下します。最適な間隔はシナリオによって異なります:監視ダッシュボードでは5〜15秒、ニュースフィードでは30〜60秒、重要なアラートでは1〜3秒です。間隔の選択は常にデータの鮮度とインフラ負荷のトレードオフです。
アイドル期間中の負荷を軽減するために、適応型間隔が使用されます:連続する複数のリクエストが空の結果を返した場合、間隔が増加します(例:5秒から15秒)。新しいデータが表示されると、間隔は最小値にリセットされます。指数バックオフアルゴリズムにより、更新頻度が低い場合に空のリクエスト数を3〜5倍削減できます。
setIntervalとFetch APIを使用したクライアント側のShort Polling実装を見てみましょう。この関数はエンドポイントURLとポーリング間隔(ミリ秒)を受け取ります。
function startPolling(url, intervalMs) {
const lastTimestamp = new Date().toISOString();
const timerId = setInterval(async () => {
try {
const params = new URLSearchParams({
since: lastTimestamp
});
const response = await fetch(url + "?" + params);
const data = await response.json();
if (data.updates && data.updates.length > 0) {
renderUpdates(data.updates);
console.log("受信しました", data.updates.length, "updates");
}
} catch (error) {
console.error("ポーリング失敗:", error);
}
}, intervalMs);
return timerId;
}
const timer = startPolling("/api/updates", 5000);
// clearInterval(timer)による停止
コードは5秒間隔のポーリングを作成し、最後の更新のタイムスタンプをサーバーに渡します。サーバーはこのパラメーターを使用してデータをフィルタリングし、新しいレコードのみを返すことで、送信される情報量を削減できます。関数はポーリングを停止するためのタイマー識別子を返します。
Short Pollingのサーバー側の実装は非常にシンプルです。GETリクエストを受け入れ、現在の状態または指定されたタイムスタンプ以降に変更されたデータを含むJSONレスポンスを返す、通常のRESTエンドポイントです。
const express = require("express");
const app = express();
let items = [];
app.get("/api/updates", (req, res) => {
const since = req.query.since;
const filtered = items.filter(item => item.timestamp > since);
res.json({ updates: filtered });
});
app.listen(3000);
サーバーはsinceパラメーターを受け取り、タイムスタンプが指定値を超えるレコードをフィルタリングします。このアプローチにより、各レスポンスのデータ量が最小限になり、増分変更のみが返されます。新しいデータがない場合、サーバーは空の配列を返し、クライアントはスケジュールに従ってポーリングを続行します。
Short Polling とLong Pollingは同じ問題(サーバーからクライアントへのデータ配信)を解決しますが、効率性が根本的に異なります。Short Pollingは固定のリクエスト間隔を使用して予測可能な負荷を生成する一方、Long Pollingはイベントが発生するまで接続を開いたままにして、空のレスポンス数を最小限に抑えます。
| 基準 | Short Polling | Long Polling |
|---|---|---|
| 実装の複雑さ | 低い、標準REST | 中程度、非同期処理 |
| 更新レイテンシ | 固定、最大N秒 | 最小限、イベント発生時 |
| リクエスト数 | 一定、毎分Nリクエスト | イベントベース、通常は大幅に少ない |
| サーバー負荷 | 短い間隔で高い | 接続維持、非同期処理 |
| アイドル時のトラフィック | 最大、各リクエストにヘッダー | 最小限、1つの開かれた接続 |
| スケーラビリティ | シンプル、ステートレスクエリ | 複雑、共有イベントキューが必要 |
技術の選択はデータの更新頻度に依存します。イベントが10秒に1回以上発生する場合、両方のアプローチで同等の負荷が発生し、Short Pollingの方がシンプルです。イベントが稀な場合(変更間隔が数時間または数分)、Long Pollingは空のリクエストを生成しないため推奨されます。中間のシナリオでは、インフラストラクチャの制約とWebSocketを使用する可能性によって選択が決まります。
Short Polling は、データの鮮度要件が低く、効率性よりも実装のシンプルさが優先されるシナリオで使用されます。最も典型的なケースは、内部管理パネル、アラート頻度の低い監視システム、15〜30秒の遅延が許容されるアプリケーションです。
重要な制限 — Short Pollingは、1秒の遅延も許容されない時間重視のアプリケーション(取引端末、緊急警報システム)には適していません。そのようなシナリオでは、WebSocket、Server-Sent Events、またはLong Pollingを使用する必要があります。Short Pollingでシステムを設計する際は、リクエスト予算を計算する必要があります:5秒間隔で1,000のクライアントがいる場合、サーバーは毎分12,000のリクエストを処理し、それに見合ったリソースベースが必要です。
よくある質問
Short Polling とは、アプリケーションがN秒ごとにサーバーに「新しいデータはありますか?」と尋ね、サーバーは変更がなくても毎回応答する方式です。これは、新しいメールが届いたかどうかを確認するために5分ごとに郵便受けに行くようなものです。
最適なShort Polling間隔はシナリオによって異なります:監視ダッシュボードでは5〜10秒、ニュースフィードでは15〜30秒、ステータスページでは30〜60秒です。間隔はデータの鮮度とサーバー負荷の妥協点である必要があります。10秒から開始し、テスト結果に基づいて調整してください。
Short Polling はクライアントが一定間隔でサーバーに問い合わせ続けます。Long Pollingはクライアントが1つのリクエストを行い、サーバーはデータが現れるまでそれを開いたままにします。Short Pollingは実装が簡単ですが、更新が稀な場合により多くの空のリクエストが発生します。
Short Polling はWebSocketよりも実装が簡単で、特別なプロトコルは不要です。通常のHTTPリクエストで動作します。Short Pollingは、10〜30秒の遅延が許容され、WebSocketをサポートするためのインフラコストが正当化されないシンプルな内部システムに適しています。
適応型間隔を使用します:更新がない場合、リクエスト間の待機時間を2〜3倍に増やします。最後のリクエストのタイムスタンプを含むsinceパラメーターを追加して、サーバーが増分変更のみを返すようにします。CDNまたはプロキシサーバー側でレスポンスをキャッシュして、バックエンドの負荷を軽減します。
まとめ
setIntervalまたは再帰的setTimeoutによる一定または適応型間隔の周期的ポーリング。ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。