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 ヘッダーを含めてクライアントにリトライ時間を通知する。

現場での応用を知るには関連書籍も役立つ。

この記事は役に立ちましたか?

関連用語

関連する記事