レートリミットとは何か
レートリミット(Rate Limit、「速度制限」の意)とは、特定の利用者や端末からのアクセス回数を、一定時間あたりに制限する仕組みのことです。「短時間にアクセスしすぎたため、一時的に弾かれる」という現象の多くは、このレートリミットによるものです。
なぜアクセス回数を制限する必要があるのか
サーバーが処理できる能力には限りがあります。もし1つの利用者が、短時間に大量のアクセスを送り続けることを無制限に許してしまうと、以下のような問題が起こります。
- サーバーの処理能力が偏って使われてしまい、他の利用者の応答が遅くなる
- 悪意ある第三者が、パスワードを総当たりで試すような攻撃を仕掛けやすくなる
- プログラムの不具合による意図しない大量アクセスが、サーバー全体に影響を及ぼす
こうした事態を防ぐため、あらかじめ「1分間に◯回まで」といった上限を設け、それを超えたアクセスを一時的に拒否する仕組みが導入されています。
「順番待ちの整理券」に例えると
レートリミットの仕組みは、人気店の整理券に例えるとイメージしやすくなります。お店(サーバー)が一度に対応できる人数には限りがあるため、「1人あたり10分に1回まで」といったルールを設け、それを超えて何度も列に並ぼうとする人には、少し待つようお願いする、というイメージです。
レートリミットにかかるとどうなるか
レートリミットの上限を超えてアクセスすると、多くの場合、以下のような応答が返されます。
- 「しばらくしてから再度お試しください」といったメッセージの表示
- HTTPステータスコード「429(Too Many Requests)」という、専用のエラー番号での応答
- 一定時間が経過するまで、同じ操作を繰り返しても拒否され続ける状態
開発者にとってのレートリミット
外部のサービスが提供するAPI(プログラム同士がデータをやり取りする窓口)の多くには、レートリミットが設定されています。開発者は、この上限を超えないよう、アクセスの頻度を調整したり、一定間隔を空けてリクエストを送るといった工夫を行う必要があります。
「システム障害かと思ったら、実は自分側が原因だった」
レートリミットで印象に残るのは、「サービスが壊れたと思ったら、実は短時間にリクエストを送りすぎていただけだった」というケースです。APIを使ってデータを取得するとき、最初は「必要なデータを全部取りに行けばいい」と考えてしまいがちです。ところが、ループ処理などで大量のリクエストを一気に送ると、サービス側から「少し待ってください」と制限をかけられることがあります。利用者からすると「さっきまで動いていたのに、急にエラーになった」ので、システム障害に見えます。逆に、自分たちがサービスを作る側なら、レートリミットを設定していないことで、想定以上のアクセスが集中してシステムに負荷がかかることもあります。レートリミットは「利用者を邪魔するための制限」ではなく、サービスを守りながら公平に使ってもらうための仕組みだと考えると分かりやすいです。
振り返ると
レートリミットは、限られたサーバーの処理能力を、すべての利用者に公平に、かつ安全に届けるための「アクセス回数の整理券」のような仕組みです。エラーに遭遇した際は、慌てずに少し時間を置いてから再度試してみましょう。
関連記事:APIをループで呼ぶ時の3つの約束