解説
レート制限とは、サーバーが不正使用から自身を守る仕組みです。公開されているすべてのAPIやウェブサイトは、単一クライアントが一定時間内に送信できるリクエスト数を制限しています。例:`100 requests per IP per minute`、`5000 requests per API key per hour`、`30 logins per account per day`。クライアントが上限を超えると、サーバーは429 Too Many Responsesを返します(場合によっては、静かに応答を遅くしたり、リクエストをキューに入れたり、CAPTCHAを表示したりすることもあります)。
スクレイピングやデータ収集の作業において、レート制限はどれだけ速く処理できるかを決める運用上の基本条件です。単純な解決策(リクエスト数を減らす)はスループットを制限します。真の解決策は、リクエストを多くの識別子(IP、アカウント、セッションID)に分散させ、いかなる単一識別子も上限を超えないようにすることです。それがレジデンシャルプロキシが製品カテゴリとして存在する理由です。
サーバー側のレート制限アルゴリズムにはいくつかの種類があります。トークンバケットは、クライアントが上限まで一定速度でトークンを蓄積でき、上限サイズまでのバーストを許容します。スライディングウィンドウは、移動する時間ウィンドウ内のリクエストをカウントし、上限を平滑化します。固定ウィンドウは、時刻の境界(毎分、毎時)でカウントをリセットします。それぞれ、スクレイパーがリクエストのペースをどう調整すべきかに異なる影響を与えます。
仕組み
サーバーは受信リクエストのたびにクライアントを識別し(IP、API key、アカウントID、またはセッショントークンによって)、現在のウィンドウ内でその識別子のカウンターを確認します。カウンターが上限以下であれば、リクエストは通過してカウンターが加算されます。カウンターが上限を超えている場合、サーバーは429を返し、待機時間を示す `Retry-After` ヘッダーを付与します。
ほとんどの大規模APIは複数の識別子を組み合わせて使用しています。同じIPとアカウントでも、異なるカウンターに対して異なる制限が適用されます。たとえばCloudflareのレート制限ルールは、IP、URL パス、セッション、またはそれらの任意の組み合わせで制限をスコープできます。より高度なシステムでは、より滑らかな制御のためにリーキーバケットやスライディングウィンドウカウンターの変形を使用します。