使い過ぎを抑えるレートリミット

レートリミットは、短い時間に受け付ける依頼の数へ上限を付けて、混雑や使いすぎを防ぐ仕組みです。

レートリミットは、短い時間に受け付ける依頼の数に上限を付けて、混雑や使いすぎを防ぐ仕組みです。役所の窓口で「1分に受け付ける件数はここまで」と決めておけば、一度に人が押し寄せても窓口はパンクせず、特定の人が窓口を占領することもない。上限を超えた人には、少し待ってから来てもらう。考え方はこれと同じです。

API や Web サービスは、短い時間に大量のリクエストが来ると、処理が遅れたり止まったりすることがあります。公開 API、ログイン画面、検索機能など、誰でも呼び出せる窓口でよく使われます。

何のために、何を単位に数えるか

レートリミットを入れる目的は、大きく分けて2つあります。一つはサーバーを守る負荷対策、もう一つは悪用を防ぐ不正対策です。どちらの目的かで、数え方も上限の値も変わります。

目的数える単位の例使われる場面
負荷を抑える利用者ごと、APIキーごと公開 API の大量呼び出しを防ぐ。障害時に、これ以上の集中で悪化させない
悪用を防ぐIPアドレスごと、アカウントごとログインの試行や検索の連打を抑える
契約の範囲を守る契約やプランごと無料プランと有料プランで使える量を分ける

ログインの総当たりを抑えたいときは、人か機械かを見分ける CAPTCHA と組み合わせることもあります。危ない中身のアクセスを止める WAF と違い、レートリミットが見ているのは中身ではなく回数です。

上限に当たった人への返し方

厳しくしすぎると、普通に使っているだけの利用者まで止めてしまいます。上限の値は、実際の使われ方を見ながら決めます。

上限を超えたときの返し方も設計の一部です。「しばらくしてから再度お試しください」だけでなく、どれくらい待てばよいのかが伝わると、使う側は困りません。API を公開しているなら、上限と超えたときの挙動を仕様として書いておきます。

なお、レートリミットは混雑を抑える道具で、遅いものを速くする道具ではありません。アプリが重い、データベースが遅い、サーバーの台数が足りない、といった原因は、別に手を打つ必要があります。