API スロットリング
API へのリクエスト数を制限し、サーバーの過負荷を防ぐトラフィック制御手法
API耐障害性
API スロットリングとは
API スロットリングは、API へのリクエスト数を一定の上限に制限し、サーバーの過負荷を防ぐトラフィック制御手法である。API Gateway がデフォルトでスロットリングを提供する。
スロットリング vs レートリミット
スロットリングとレートリミットの違いを以下にまとめる。
| 観点 | スロットリング | レートリミット |
|---|---|---|
| 超過時の動作 | リクエストを遅延 | リクエストを拒否 (429) |
| ユーザー体験 | 遅いが応答する | エラーが返る |
| 実装 | トークンバケット | カウンター |
API Gateway のスロットリング
API Gateway のスロットリングを以下にまとめる。
| 設定 | デフォルト |
|---|---|
| アカウント全体 | 10,000 req/秒 |
| ステージ | 10,000 req/秒 |
| ルート | 無制限 (ステージの上限まで) |
| バースト | 5,000 |
トークンバケットアルゴリズム
トークンバケットアルゴリズムを図で示す。
バケット容量: 100 トークン
補充レート: 10 トークン/秒
リクエスト → トークンを 1 つ消費
トークンが 0 → 429 Too Many Requests
バースト: バケットが満タンなら 100 リクエストを一度に処理可能
クライアント側の対応
クライアント側の対応のコード例を示す。
// 429 を受けたら指数バックオフでリトライ
async function callApi(url: string, retries = 3): Promise<Response> {
for (let i = 0; i < retries; i++) {
const res = await fetch(url);
if (res.status !== 429) return res;
const delay = Math.min(1000 * 2 ** i, 30000);
await new Promise(r => setTimeout(r, delay + Math.random() * 1000));
}
throw new Error('Rate limited');
}
スロットリングの設計指針
テナントごとに制限を設け、Usage Plan で API キーごとに上限を設定する。無料プランは 100 req/分、有料プランは 1000 req/分のように段階的な制限を設計し、429 レスポンスには Retry-After ヘッダーを含めてクライアントにリトライ時間を通知する。
現場での応用を知るには関連書籍も役立つ。
この記事は役に立ちましたか?
関連用語
レート制限
API やサービスへのリクエスト数に上限を設け、過負荷を防ぐ仕組み
API Gateway
API のエントリーポイントとして認証、スロットリング、ルーティングを一元管理する AWS サービス
指数バックオフとは - リトライ間隔の設計とジッター付き実装例
指数バックオフはリトライ間隔を 2 倍ずつ増やして障害時の負荷集中を防ぐ戦略。ジッター追加の理由と Go/Python/TypeScript での実装パターンを解説
レート制限パターン
API やサービスへのリクエスト数を制限し、過負荷やリソース枯渇を防ぐ設計パターン
楽観的ロック
データの読み取り時にロックせず、更新時にバージョンを検証して競合を検出する排他制御
分散ロック
分散システムで複数のプロセスが同じリソースに同時アクセスすることを防ぐ排他制御