ロングポーリング
サーバーがデータの準備ができるまでレスポンスを保留し、擬似的なリアルタイム通信を実現する手法
ロングポーリングとは
ロングポーリング (Long Polling) は、クライアントがサーバーにリクエストを送り、サーバーがデータの準備ができるまでレスポンスを保留する手法である。通常のポーリング (短いポーリング) が定期的にリクエストを繰り返すのに対し、ロングポーリングはサーバー側でイベントが発生するまで接続を維持する。
通常のポーリングとの比較
通常のポーリングはデータの有無にかかわらず即座にレスポンスを返すため、データがない間も無駄なリクエストが繰り返される。ロングポーリングはサーバーがデータの到着まで接続を保持し、データが来た時点でレスポンスを返す。これにより無駄なリクエストが減り、リアルタイム性も向上する。
短いポーリング:
クライアント → リクエスト → サーバー (データなし → 即座に空レスポンス)
クライアント → リクエスト → サーバー (データなし → 即座に空レスポンス)
クライアント → リクエスト → サーバー (データあり → レスポンス)
ロングポーリング:
クライアント → リクエスト → サーバー (データが来るまで保留...)
(データあり → レスポンス)
クライアント → 即座に再リクエスト → サーバー (保留...)
リアルタイム通信手法の比較
リアルタイム通信手法の比較を以下に示す。
| 手法 | 方向 | レイテンシ | 複雑さ | サーバー負荷 |
|---|---|---|---|---|
| 短いポーリング | クライアント → サーバー | 高い (間隔依存) | 低い | 高い (空リクエスト多数) |
| ロングポーリング | 擬似双方向 | 中程度 | 中程度 | 中程度 |
| SSE | サーバー → クライアント | 低い | 低い | 低い |
| WebSocket | 双方向 | 最低 | 高い | 低い |
クライアント側の実装
クライアント側の実装のコード例を示す。
async function longPoll(url: string) {
while (true) {
try {
const response = await fetch(url, {
signal: AbortSignal.timeout(30000), // 30秒タイムアウト
});
const data = await response.json();
handleData(data);
} catch (error) {
if (error instanceof DOMException && error.name === 'TimeoutError') {
continue; // タイムアウト → 再接続
}
await new Promise(r => setTimeout(r, 3000)); // エラー → 3秒待って再接続
}
}
}
サーバー側の実装
サーバー側の実装のコード例を示す。
app.get('/api/notifications', async (req, res) => {
const timeout = setTimeout(() => {
res.json({ data: null }); // 30秒でタイムアウト
}, 30000);
const data = await waitForNewData(req.query.lastId); // データが来るまで待機
clearTimeout(timeout);
res.json({ data });
});
Lambda での制約
Lambda は最大 29 秒 (API Gateway のタイムアウト) しか接続を維持できないため、ロングポーリングには不向き。代替手段として、API Gateway WebSocket (Lambda と WebSocket の統合)、AppSync Subscriptions (GraphQL のリアルタイム通知)、SQS + 短いポーリング (クライアントが SQS を定期的にチェック) がある。
使うべきケース
- WebSocket や SSE が使えない環境 (プロキシ制限、古いブラウザ)
- シンプルな通知機能で、WebSocket ほどの双方向通信が不要
- 既存の HTTP インフラをそのまま使いたい場合
ロングポーリングの理解を深めるには関連書籍が参考になる。
この記事は役に立ちましたか?
関連用語
WebSocket API
API Gateway の WebSocket API でサーバーレスなリアルタイム双方向通信を実現する仕組み
Fetch API
HTTP リクエストを送信するためのモダンな Web API で、XMLHttpRequest の後継
Webhook
イベント発生時にサーバーが指定された URL に HTTP リクエストを送信する、プッシュ型の通知メカニズム
GraphQL Subscription
GraphQL でサーバーからクライアントへリアルタイムデータ更新を配信する仕組み
SSE (Server-Sent Events) とは - サーバーからのリアルタイム配信の仕組み
SSE はサーバーからクライアントへ HTTP 上で一方向のリアルタイムストリームを送る仕組み。WebSocket との違い・EventSource API の使い方・再接続処理を解説
水平スケーリング
サーバーの台数を増やして処理能力を向上させるスケーリング手法
関連する記事
技術書のサンプルコードが動かないときの対処法
技術書のサンプルコードがエラーで動かない原因と、自力で解決するための具体的な手順を解説します。バージョン違い、環境差異、誤植への対応方法。
機械学習・AI 本ガイド - エンジニアが読むべき技術書の選び方
機械学習の基礎から実践まで学べる技術書の選び方を紹介。「Python ではじめる機械学習」などのハンズオン本を軸に、数学が苦手な人向けの学習ルートと ML 本の賞味期限の見極め方を解説します。
チーム開発・マネジメント本ガイド - 技術リーダーが読むべき本
チーム開発、1on1、技術マネジメントを学べる技術書の選び方を紹介。メンバー時代からマネージャーまで、段階別の読書ロードマップを解説します。