最終曎新:

APIレヌトリミットの仕組み — 429が出たら䜕を確認する


䜿える回数ず、埅ち方を分けお考える

蚱可蚌を1枚ず぀䜿う✓ 1枚✓ 1枚✓ 1枚① ② ③ の呌び出しを通す蚱可蚌は3枚 → 0枚④ は、補充たで通せない回数・補充の蚭定はサヌビス次第429が返ったら429 Too Many RequestsRetry-After: 30䟋受信から30秒は埅぀同じ芁求を連打しない✓ ヘッダヌず利甚芏則を確認Retry-Afterがない応答もある
巊は補充前のトヌクンバケットの䟋です。右の30秒は説明甚の応答で、すべおのAPIの制限倀ではありたせん。
ひよこ ひよこ
商品怜玢APIを䜕床も呌んだら、429っお返っおきたよ。
ペンギン先生 ペンギン先生
決められた時間内の呌び出し量を制限するレヌトリミットに達したのかもしれないね。たず応答ずAPIの芏玄を確認しよう。䞋では「同じ60秒枠で3回たで」ずいう小さな䟋から芋るよ。
ひよこ ひよこ
えヌ、なんでわざわざ制限するのたくさん䜿わせおくれればいいのに
ペンギン先生 ペンギン先生
気持ちは分かるけど、制限がないず倧倉なこずになるよ。たずえば1人のナヌザヌが毎秒1䞇回リク゚ストを送ったら、凊理胜力を超えるず他のナヌザヌも䜿えなくなるおそれがある。レヌトリミットには䞻に3぀の目的があるんだ。サヌバヌの保護、ナヌザヌ間の公平性の確保、そしおDDoS攻撃のような悪意あるアクセスぞの防埡だね。
ひよこ ひよこ
なるほど、みんなが快適に䜿えるようにするための仕組みなんだね具䜓的にはどうやっお回数を数えおるの
ペンギン先生 ペンギン先生
䞀番シンプルなのは「固定りィンドり方匏」だよ。たずえば「1分間に100回たで」ずいうルヌルなら、毎分00秒にカりンタヌをれロにリセットしお、リク゚ストが来るたびに1を足しおいく。100回たでは受け付け、101回目から次のリセットたで拒吊するんだ。実装が簡単だから広く䜿われおるよ。
ひよこ ひよこ
シンプルでいいねでも䜕か匱点ずかあるの
ペンギン先生 ペンギン先生
いいずころに気づいたね。固定りィンドりには「境界問題」があるんだ。たずえば0:59に100回、1:00にたた100回リク゚ストを送るず、実質2秒間に200回のアクセスが集䞭しちゃう。これを解決するのが「スラむディングりィンドり方匏」で、盎近の時間窓を芋お刀定するんだ。個々の時刻を厳密に蚘録する方匏ならこの䟋の集䞭を防げるけれど、時間を区間に分けお近䌌する実装もあるので、粟床ず蚈算量に違いがあるよ。
ひよこ ひよこ
スラむディングりィンドりのほうが賢いんだね他にも方匏っおあるの
ペンギン先生 ペンギン先生
有名なのが「トヌクンバケット方匏」だよ。バケツの䞭にトヌクン蚱可蚌が入っおいお、リク゚ストを送るたびにトヌクンを1぀消費する。トヌクンは䞀定のペヌス、たずえば1秒に10個ず぀自動で補充されるんだ。バケツが空になったらリク゚ストは拒吊されるけど、バケツには容量の䞊限があり、貯たったトヌクンの範囲でバヌストも蚱容される。平均的な流量を制限し぀぀、䞀時的な集䞭は柔軟に受け入れおくれるバランスのいい方匏だね。
ひよこ ひよこ
トヌクンが貯たっおれば䞀気に䜿えるのは䟿利だねずころで、あずどれくらいリク゚ストできるかっおどうやっお知るの
ペンギン先生 ペンギン先生
APIによっおはHTTPレスポンスヘッダヌで教えおくれるよ。たずえばGitHubのREST APIでは、X-RateLimit-Limitが䞊限回数、X-RateLimit-Remainingが残り回数、X-RateLimit-Resetがリセットされる時刻だね。ただしヘッダヌ名や単䜍はAPIごずに違うし、別の二次制限もある。残り回数だけで次の成功を保蚌するものではないよ。
ひよこ ひよこ
それでも429゚ラヌが出ちゃったずきはどうすればいいの
ペンギン先生 ペンギン先生
そのずきは「指数バックオフ」でリトラむするのも方法の1぀だよ。1回目のリトラむは1秒埌、2回目は2秒埌、3回目は4秒埌 ず埅ち時間を倍々に増やしおいく方法だね。Retry-Afterは埅機する秒数たたはHTTP日時なので、その倀ずAPIの再詊行芏玄に埓おう。再詊行回数には䞊限を蚭け、埅ち時間にランダムなずれを入れるず䞀斉再詊行を枛らせるよ。絶察にやっおはいけないのは、429が返っおきたのに即座にリトラむし続けるこず。サヌバヌにさらに負荷をかけおしたっお、状況が悪化するだけだよ。
ひよこ ひよこ
倍々に埅぀のは賢いやり方なんだねレヌトリミットっおアプリのコヌドで実装するものなの
ペンギン先生 ペンギン先生
自分で実装するこずもできるけど、最近はAPI GatewayやCDNの機胜ずしお提䟛されるこずが倚いよ。たずえばAWSのAPI Gatewayなら、レヌトずバヌスト容量を蚭定できる。ただし䞊限はベスト゚フォヌトの目暙倀で、厳密な最倧回数の保蚌ではないよ。゚ッゞ偎に制限を眮けば、条件に合うリク゚ストをサヌバヌぞ転送する前に止める蚭蚈もできるよ。レヌトリミットだけですべおのDDoSを防げるわけではないんだ。倧芏暡なサヌビスでは、ナヌザヌごず・APIキヌごず・IPアドレスごずに別々の制限を蚭けたりもするよ。

たずは、商品怜玢を4回続けお呌ぶ堎面を芋る

レヌトリミットは、決めた時間内の呌び出し量を制限する仕組みです。商品を怜玢するAPIぞ、同じ利甚者から連続で4回アクセスするずしたす。

「同じ固定の60秒枠で3回たで」ずいう緎習甚のルヌルなら、次のように刀定できたす。実際のサヌビスの制限倀ではありたせん。

呌び出し枠内の回数刀定
1回目1受け付ける
2回目2受け付ける
3回目3受け付ける
4回目既に3今は受け付けない

HTTPでは、制限に達したこずを429 Too Many Requestsで䌝える方法がありたす。ただし、429を必ず返すずは限らず、負荷や蚭蚈によっお接続を拒吊する堎合もありたす。誰を同じ利甚者ずしお数えるか、APIごずか党䜓かは、サヌビスの芏玄を確認したす。

429が返ったら、たず応答ず芏玄を読む

次は説明甚の応答の䞀郚です。

HTTP/1.1 429 Too Many Requests
Retry-After: 30

このRetry-Afterは、応答を受けおから30秒埅぀指定です。HTTP日時で瀺される堎合もありたす。必ず付いおいるヘッダヌではないので、APIの再詊行手順も確認しおください。

  1. 同じリク゚ストを送り続ける凊理を止める。
  2. Retry-AfterやAPIの制限・再詊行芏玄を確認する。
  3. 再詊行できる凊理か確かめ、回数ず埅ち時間に䞊限を付ける。
  4. 改善しなければ、呌び出し回数や䞊列数、キャッシュを芋盎す。

読み取りず泚文・決枈では、再詊行の意味も違いたす。結果が分からない曞き蟌みを繰り返す堎合は、二重凊理を防ぐ蚭蚈が必芁です。

窓の境目ず、トヌクンの補充は別の方匏

固定りィンドりでは、同じ枠の䞊限内であれば、終わり際ず次の枠の始めに呌び出しが集䞭し埗たす。䟋えば各枠3回なら、境目をたたぐ短時間に合蚈6回を受け付けるこずがありたす。「任意の盎近60秒でも必ず3回」ではありたせん。

スラむディングりィンドりには、個々の時刻を远う方匏や、区間ごずに近䌌する方匏がありたす。トヌクンバケットでは、䞊限たで蚱可蚌を貯め、決めたペヌスで補充しお消費したす。貯たった分の䞀時的な集䞭は蚱せたすが、補充で容量を超えお増やし続けるわけではありたせん。

図のトヌクン3枚は仕組みを芋るための䟋です。1回に぀き1枚なら、同時点で4回目を送る前に補充がなければ、蚱可蚌が足りたせん。

運甚では「数える単䜍」も確かめる

IP単䜍では、同じネットワヌクの耇数利甚者が枠を共有する堎合がありたす。利甚者やAPIキヌ単䜍なら、認蚌の扱いを確認したす。耇数サヌバヌで別々に数える実装は、サヌビス党䜓の厳密な䞊限にならないこずもありたす。

GitHubのX-RateLimit-Remainingなどの倀は刀断材料ですが、䞀次制限ずは別の制限もあり、残数があるから次の成功を保蚌するものではありたせん。AWS API Gatewayの䞊限もベスト゚フォヌトの目暙倀です。レヌトリミットだけで、すべおのDDoS攻撃を防げるわけでもありたせん。

芚え方ず次の䞀歩

「レヌトリミット」っお出おきたら「䞀定の時間に受け付ける量の制限」ず思えばだいたいOK

次はAPI開発入門で応答を確認し、サヌキットブレヌカヌず、量を制限する仕組み・障害時に遮断する仕組みを比べられたす。

参考資料

  • RFC 9110 section 10.2.3 — Retry-Afterは秒数たたはHTTP日時。
  • GitHub REST API rate limits — 未認蚌は送信元IP単䜍60/時、認蚌ナヌザヌは通垞5000/時。怜玢・二次制限・認蚌方匏などの䟋倖。
  • AWS API Gateway throttling — トヌクン補充速床・容量、䞊限はベスト゚フォヌト。
  • ASP.NET Core rate limiting — スラむディングの区間分割実装ず容量を超えないトヌクン補充。
  • RFC 6585429 Too Many Requests — 429の意味ずRetry-After、識別単䜍ず数え方はサヌビス次第