【仕組み解説】APIのレートリミットはどうやってリクエストを制限しているのか — 流量制御の仕組みを図解


トークンバケット方式によるレートリミット トークン補充 一定ペースで追加 バケツ トークン残り 8個 消費 リクエスト判定 トークンあり → 200 OK トークンなし → 429 Error ✅ 許可されたリクエスト X-RateLimit-Remaining: 7 X-RateLimit-Limit: 100 ❌ 拒否されたリクエスト 429 Too Many Requests Retry-After: 30 バケツにトークンがある限りリクエストを許可し、空になると拒否する
トークンバケット方式によるレートリミット
ひよこ ひよこ

APIを使ってると、たまに「429 Too Many Requests」ってエラーが出るんだけど、これって何なの?

ペンギン先生 ペンギン先生

それはレートリミットに引っかかったときのエラーだよ。APIには「1分間に100回まで」みたいなリクエスト回数の制限があって、それを超えるとサーバーが429エラーを返して『ちょっと待ってね』と教えてくれるんだ。

ひよこ ひよこ

えー、なんでわざわざ制限するの?たくさん使わせてくれればいいのに!

ペンギン先生 ペンギン先生

気持ちは分かるけど、制限がないと大変なことになるよ。たとえば1人のユーザーが毎秒1万回リクエストを送ったら、サーバーがパンクして他のユーザーも使えなくなっちゃう。レートリミットには主に3つの目的があるんだ。サーバーの保護、ユーザー間の公平性の確保、そしてDDoS攻撃のような悪意あるアクセスへの防御だね。

ひよこ ひよこ

なるほど、みんなが快適に使えるようにするための仕組みなんだね!具体的にはどうやって回数を数えてるの?

ペンギン先生 ペンギン先生

一番シンプルなのは「固定ウィンドウ方式」だよ。たとえば「1分間に100回まで」というルールなら、毎分00秒にカウンターをゼロにリセットして、リクエストが来るたびに1を足していく。カウンターが100になったら、次のリセットまで全部拒否するんだ。実装が簡単だから広く使われてるよ。

ひよこ ひよこ

シンプルでいいね!でも何か弱点とかあるの?

ペンギン先生 ペンギン先生

いいところに気づいたね。固定ウィンドウには「境界問題」があるんだ。たとえば0:59に100回、1:00にまた100回リクエストを送ると、実質2秒間に200回のアクセスが集中しちゃう。これを解決するのが「スライディングウィンドウ方式」で、現在時刻から過去1分間をリアルタイムに見て判定するから、境界をまたいだバーストを防げるんだよ。

ひよこ ひよこ

スライディングウィンドウのほうが賢いんだね!他にも方式ってあるの?

ペンギン先生 ペンギン先生

有名なのが「トークンバケット方式」だよ。バケツの中にトークン(許可証)が入っていて、リクエストを送るたびにトークンを1つ消費する。トークンは一定のペース、たとえば1秒に10個ずつ自動で補充されるんだ。バケツが空になったらリクエストは拒否されるけど、バケツに余裕があればバーストも許容される。平均的な流量を制限しつつ、一時的な集中は柔軟に受け入れてくれるバランスのいい方式だね。

ひよこ ひよこ

トークンが貯まってれば一気に使えるのは便利だね!ところで、あとどれくらいリクエストできるかってどうやって知るの?

ペンギン先生 ペンギン先生

多くのAPIHTTPレスポンスヘッダーで教えてくれるよ。代表的なのは3つ。X-RateLimit-Limitが上限回数、X-RateLimit-Remainingが残り回数、X-RateLimit-Resetがリセットされる時刻だね。これを見れば「あと何回使えるか」「いつ回復するか」が分かるから、アプリ側で制限に引っかかる前にペースを調整できるんだ。

ひよこ ひよこ

それでも429エラーが出ちゃったときはどうすればいいの?

ペンギン先生 ペンギン先生

そのときは「指数バックオフ」でリトライするのがベストプラクティスだよ。1回目のリトライは1秒後、2回目は2秒後、3回目は4秒後…と待ち時間を倍々に増やしていく方法だね。Retry-Afterヘッダーが返ってきたらその秒数だけ待つのも大事。絶対にやってはいけないのは、429が返ってきたのに即座にリトライし続けること。サーバーにさらに負荷をかけてしまって、状況が悪化するだけだよ。

ひよこ ひよこ

倍々に待つのは賢いやり方なんだね!レートリミットってアプリのコードで実装するものなの?

ペンギン先生 ペンギン先生

自分で実装することもできるけど、最近はAPI GatewayやCDNの機能として提供されることが多いよ。たとえばAWSAPI Gatewayなら、設定画面でレート上限を指定するだけで自動的に制御してくれる。CloudflareみたいなCDNもエッジレベルでレートリミットをかけられるから、悪意あるリクエストがサーバーに届く前にブロックできるんだ。大規模なサービスでは、ユーザーごと・APIキーごと・IPアドレスごとに別々の制限を設けたりもするよ。

ひよこ ひよこ

いろんなレイヤーで守ってるんだね!APIを作る側も使う側も知っておくべきことなんだなぁ。

ペンギン先生 ペンギン先生

そうだね。ちなみにプロの現場だと、レートリミットの設計はビジネス判断でもあるんだ。無料プランは1分100回、有料プランは1分1000回、みたいに料金プランと連動させることも多い。GitHubAPIもログインしてないと1時間60回、認証済みなら5000回と大きく差がつくよ。レートリミットは単なる技術的制約じゃなくて、サービスの価値設計にも関わる重要な仕組みなんだね。