Discord bot開発者なら誰もが遭遇する可能性のあるレート制限

botがAPIに過剰なリクエストを送信すると、レート制限に引っかかり、意図したように動作しなくなることがあります。

この記事では、レート制限の原因と対策、そしてDiscordが提供する回避策について解説します。

レート制限の種類

Discordには、主に以下の2種類のレート制限があります。

  1. APIレート制限: APIへのリクエスト回数に制限があります。
    • 制限: 1秒間に50リクエスト
    • 超過した場合: HTTP 429レスポンスコードが返されます。
    • 無効なリクエスト: 10分あたり10,000件まで
  2. ゲートウェイレート制限: Discordとのデータ送受信に利用するwebsocket接続に制限があります。
    • シャーディング: 複数のwebsocket接続を開くことで、1つの接続への負荷を分散させることができます。
    • シャードID: shard_id = (guild_id >> 22) % num_shards の式で計算されます。

レート制限の回避策

  • アプリケーションコマンドの利用: インタラクションエンドポイントはレート制限に縛られないため、アプリケーションコマンドに移行することでレート制限を回避できます。
  • シャーディング: botを複数のインスタンスに分割することで、ゲートウェイレート制限を回避できます。
  • エラー処理: APIからのエラーを適切に処理することで、CloudFlare Banを防ぐことができます。

グローバルレート制限の引き上げ

大規模bot(15万台以上のサーバーで動作しているbot)の場合、Discordに申請することでグローバルレート制限を引き上げてもらうことができます。

シャーディングの詳細

シャーディングの微調整や設定方法については、Discordの公式ドキュメントを参照してください。

レート制限に関するFAQ

Q. レート制限に引っかかった場合はどうすればよいですか?

A. リクエスト頻度を下げるか、シャーディングを導入して負荷を分散させてください。

Q. アプリケーションコマンドとは何ですか?

A. スラッシュコマンドなど、ユーザーが/を入力することで実行できるコマンドです。

Q. シャーディングはどのように設定すればよいですか?

A. Discordの公式ドキュメントを参照するか、bot開発に利用しているライブラリのドキュメントを参照してください。

レート制限を理解し、適切な対策を講じることで、安定して動作するbotを開発することができます。