api-rate-limiting について
API開発者向けのレート制限ガイドです。ユーザー別・エンドポイント別の戦略を扱い、複数のアルゴリズム、Expressミドルウェア、レスポンスヘッダーの例を示します。
主な機能
- 01トークンバケット・スライディングウィンドウ・固定ウィンドウ
- 02Expressレート制限ミドルウェアの例
- 03レート制限レスポンスヘッダーの説明
- 04段階別リクエスト制限の戦略
- 05分散レート制限の実践方法
活用シーン
- 01ユーザーごとのAPIリクエスト頻度制限
- 02APIエンドポイントごとの上限設定
- 03制限レスポンスへの標準ヘッダー追加
- 04契約プランごとのリクエスト上限設定
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ secondsky/ claude-skills --skill api-rate-limitingインストール後、Claude Code で/api-rate-limitingを入力して読み込まれたか確認します。
詳細
API レート制限
ユーザーごとおよびエンドポイントごとの戦略を使ったレート制限アルゴリズムで、API を不正利用から保護します。
アルゴリズム
| アルゴリズム | メリット | デメリット |
|---|---|---|
| トークンバケット | バーストに対応し、処理を平滑化 | ユーザーごとにメモリが必要 |
| スライディングウィンドウ | 正確 | メモリ使用量が多い |
| 固定ウィンドウ | シンプル | 境界でスパイクが発生 |
トークンバケット(Node.js)
class TokenBucket {
constructor(capacity, refillRate) {
this.capacity = capacity;
this.tokens = capacity;
this.refillRate = refillRate; // tokens per second
this.lastRefill = Date.now();
}
consume() {
this.refill();
if (this.tokens >= 1) {
this.tokens--;
return true;
}
return false;
}
refill() {
const now = Date.now();
const elapsed = (now - this.lastRefill) / 1000;
this.tokens = Math.min(this.capacity, this.tokens + elapsed * this.refillRate);
this.lastRefill = now;
}
}
Express ミドルウェア
const rateLimit = require('express-rate-limit');
const limiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 minutes
max: 100,
standardHeaders: true,
message: { error: 'Too many requests, try again later' }
});
app.use('/api/', limiter);
レスポンスヘッダー
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 45
X-RateLimit-Reset: 1705320000
Retry-After: 60
段階別の制限
| プラン | リクエスト数/時間 |
|---|---|
| 無料 | 100 |
| Pro | 1,000 |
| エンタープライズ | 10,000 |
ベストプラクティス
- 分散レート制限には Redis を使用します
- レスポンスに適切なヘッダーを含めます
- Retry-After を指定して 429 ステータスを返します
- プランごとに段階別の制限を設定します
- レート制限のメトリクスを監視します
- 負荷をかけてテストします
コメント
Markdown 対応