EASYBOT GUIDE
429 Too Many Requestsの原因とAPIレート制限の対処法
HTTP 429が返る理由、Retry-Afterの読み方、Discordや外部APIのレート制限を守る再試行方法を紹介します。
429 Too Many Requestsは、短い時間に送った要求がサービスの上限を超えた時に返るHTTPステータスです。要求を連続再送すると制限が長引くため、応答の指示に従って待つ必要があります。
まずRetry-Afterを確認
応答にRetry-Afterがあれば、その秒数または日時まで待ってから再試行します。APIごとに上限は異なり、DiscordではルートやBot単位の制限があるため、固定間隔だけの処理では不十分です。
- レスポンスヘッダーと本文のretry_afterを確認する
- 待機中は同じ要求を重ねて送らない
- 429が続く場合は処理を止めてログを確認する
再試行を安全に設計する
一斉に同じ要求を再送すると、復旧直後に再び制限へ達します。指数バックオフとランダムな待ち時間を使い、再試行回数にも上限を設けます。
- 待ち時間を段階的に増やす
- 同じ処理が重複しても壊れないよう冪等性を考慮する
- 再試行対象を429や一時的な5xxに限定する
Botでよくある原因
イベントごとに大量のメッセージを送る、失敗したログインを高速で繰り返す、スラッシュコマンドを全件更新する処理が原因になります。バッチ化やキューを使い、不要な要求を減らします。
- 同じ内容の連続送信をまとめる
- 起動時に毎回グローバルコマンドを更新しない
- イベントハンドラーの二重登録を確認する
運用時の予防
429の回数、APIルート、待機時間を記録し、急増を検知します。制限回避のためアカウントやIPを切り替える行為はサービス規約違反や停止につながるため行いません。
- 公式SDKのレート制限対応を利用する
- キューの並列数を適切に制限する
- 負荷テストは許可された環境と範囲で行う