レート制限 (Rate Limiting) とは、API やサービスに対するリクエスト数を、一定の時間枠内で上限値に制限する仕組みです。「1 分間に 60 リクエストまで」「1 日に 1,000 リクエストまで」のように設定され、上限を超えたリクエストには HTTP 429 (Too Many Requests) が返されます。
レート制限の目的は 3 つあります。第一にサーバー保護 (大量リクエストによるサービスダウンの防止)、第二に公平性の確保 (特定ユーザーによるリソースの独占防止)、第三にコスト管理 (クラウドサービスの従量課金を制御) です。
短縮 URL サービスでは、レート制限が複数の場面で適用されます。URL 短縮 API のリクエスト数制限 (スパム的な大量生成の防止)、短縮 URL へのアクセス数制限 (DDoS 攻撃の緩和)、管理画面へのログイン試行回数制限 (ブルートフォース攻撃の防止) などです。
レート制限のアルゴリズムには主に 4 種類あります。固定ウィンドウ (1 分ごとにカウンターをリセット)、スライディングウィンドウ (直近 1 分間のリクエスト数を常時計算)、トークンバケット (一定速度でトークンが補充され、リクエストごとにトークンを消費)、リーキーバケット (一定速度でリクエストを処理し、超過分をキューに蓄積) です。
API を利用する開発者がレート制限に対処するには、レスポンスヘッダー (X-RateLimit-Limit、X-RateLimit-Remaining、Retry-After) を確認し、残りリクエスト数に応じてリクエスト頻度を調整する実装が必要です。429 レスポンスを受けた場合は、Retry-After ヘッダーの値だけ待機してからリトライする指数バックオフが推奨されます。関連書籍は Amazon でも探せます。