レート制限パターン
API やサービスへのリクエスト数を制限し、過負荷やリソース枯渇を防ぐ設計パターン
レート制限パターンとは
レート制限 (Rate Limiting) は、API やサービスへのリクエスト数に上限を設け、過負荷やリソース枯渇を防ぐ設計パターンである。DDoS 攻撃の緩和、公平なリソース配分、コスト制御に使われる。
主要なアルゴリズム
主要なアルゴリズムを以下にまとめる。
| アルゴリズム | 特徴 | 用途 |
|---|---|---|
| 固定ウィンドウ | 時間窓ごとにカウント | シンプルな API 制限 |
| スライディングウィンドウ | 直近 N 秒のカウント | より正確な制限 |
| トークンバケット | トークンを一定速度で補充 | バースト許容 |
| リーキーバケット | 一定速度でリクエストを処理 | 平滑化 |
API Gateway はトークンバケットアルゴリズムを使用する。ThrottlingRateLimit がトークン補充速度、ThrottlingBurstLimit がバケットサイズ。
DynamoDB でのレート制限
DynamoDB でのレート制限のコード例を示す。
async function checkRateLimit(userId: string, limit: number): Promise<boolean> {
const now = Math.floor(Date.now() / 1000);
const windowKey = `${userId}:${Math.floor(now / 60)}`; // 1分ウィンドウ
const result = await db.update({
TableName: 'rate-limits',
Key: { pk: windowKey },
UpdateExpression: 'ADD #count :inc SET #ttl = :ttl',
ExpressionAttributeNames: { '#count': 'count', '#ttl': 'ttl' },
ExpressionAttributeValues: { ':inc': 1, ':ttl': now + 120 },
ReturnValues: 'ALL_NEW',
});
return result.Attributes!.count <= limit;
}
レスポンスヘッダー
レスポンスヘッダーを図で示す。
HTTP/1.1 200 OK
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 42
X-RateLimit-Reset: 1711929600
HTTP/1.1 429 Too Many Requests
Retry-After: 30
多層防御
多層防御を図で示す。
CloudFront (WAF) → API Gateway (スロットリング) → Lambda → DynamoDB
↑ IP ベース制限 ↑ API キーベース制限 ↑ ユーザーベース制限
レイヤーごとに異なる粒度でレート制限を適用する。
レート制限パターンの理解を深めるには関連書籍が参考になる。
この記事は役に立ちましたか?
関連用語
API スロットリング
API へのリクエスト数を制限し、サーバーの過負荷を防ぐトラフィック制御手法
サーキットブレーカーライブラリ
外部サービスの障害を検知し、自動的にリクエストを遮断して障害の連鎖を防ぐライブラリ
バックプレッシャーとは - ストリーム処理の流量制御を図解で理解する
バックプレッシャーは下流の処理能力を超えるデータ流入時に上流へ減速を伝える仕組み。Node.js Stream/RxJS/Kafka での実装パターンと OOM 回避策を解説
レート制限
API やサービスへのリクエスト数に上限を設け、過負荷を防ぐ仕組み
ソートアルゴリズム
データを特定の順序に並べ替えるアルゴリズムの総称
Template Method パターン
アルゴリズムの骨格を親クラスで定義し、具体的なステップをサブクラスに委ねるデザインパターン
関連する記事
アルゴリズム本ガイド - 競プロだけじゃない、実務に活きる選び方
アルゴリズム本の 3 タイプと、実務でアルゴリズムの知識が活きる場面、数学が苦手な人向けの学習ルートを紹介します。
機械学習・AI 本ガイド - エンジニアが読むべき技術書の選び方
機械学習の基礎から実践まで学べる技術書の選び方を紹介。「Python ではじめる機械学習」などのハンズオン本を軸に、数学が苦手な人向けの学習ルートと ML 本の賞味期限の見極め方を解説します。
手が止まったら本を開け - デバッグとしての読書
コードを書いていて手が止まる瞬間は、読書のチャンスです。実装に詰まったときに技術書を開く習慣が、問題解決力とコードの質を同時に高める理由を解説します。