Botがレート制限エラーに直面している場合でも、ご安心ください。これは一般的な問題であり、適切な対応によって解決できます。 このページでは、Discordのレート制限システムの仕組みを説明し、実用的な解決策をご案内します。
コンテンツ
Discordのレート制限の種類について理解する
DiscordはAPIを保護するために複数レート制限を使用します。 どのタイプに遭遇しているかを特定することは、正しい解決策を見つけるために不可欠です:
グローバルレート制限
制限: ほとんどのエンドポイントに対して1秒あたり50リクエスト
範囲: あなたのアプリケーション全体に適用されます
識別: 応答ヘッダー内でX-RateLimit-Scope: globalを探してください
ルートごとのレート制限
制限: エンドポイントによって異なります
範囲: 各APIルートに特有です
識別: 応答ヘッダー内でX-RateLimit-Scope: userを探してください
リソース固有のレート制限
注:リソース固有のレート制限には、複数のソース(他のユーザー、bot、Webhookなど)があり、アプリケーション単独の問題ではない場合があります。
制限: 特定のギルド、チャンネル、またはWebhookの独立した制限
範囲: 特定のリソースに対するアクションに適用されます。
識別: 応答ヘッダー内でX-RateLimit-Scope: sharedを探してください
無効なリクエスト制限
制限: 10分間に10,000件の無効なリクエスト
一般的な原因: 処理されていないエラー(401,403, または429)がリクエストのスパイクを引き起こしています。 429エラーがX-RateLimit-Scope: sharedで返された場合、無効なリクエスト制限にはカウントされません。
結果: 一時的なCloudflareの禁止
レート制限問題の特定方法
HTTP 429ステータスコードを受信したときにHTTPレスポンスヘッダーを確認することが、どの制限に達しているかを判断する最も信頼できる方法です。 確認すべき主要ヘッダー:
X-RateLimit-Limit: そのエンドポイントのレート制限の上限
X-RateLimit-Remaining: 現在のウィンドウ内で残っているリクエストの数
X-RateLimit-Reset: レート制限ウィンドウがリセットされた時刻 (Unix タイムスタンプ)
X-RateLimit-Reset-After: 制限がリセットされるまでの秒数
X-RateLimit-Scope: レート制限の種類(グローバル、ユーザー、または共有)を示します
retry_after: 再リクエストを行う前に待つミリ秒
レート制限の取り扱いに関するベストプラクティス
適切なバックオフ戦略を実装する
常にレート制限のレスポンスにおけるretry_afterの値を尊重してください。 これは、再試行するまでに正確にどれくらい待つべきかを示しています。
可能な限りインタラクションを使用することを検討してください
アプリケーションコマンド\とメッセージコンポーネント\は、プレフィックスコマンドの優れた代替手段であり、過剰なAPIリクエストやチャンネル内のメッセージを防げます。
ボーナスのヒント: インタラクション応答とフォローアップメッセージはレート制限にカウントされないため、一時的に設定してください。
キャッシュデータを効果的に
頻繁にアクセスされるデータをキャッシュすることで、API呼び出しを削減します。例えば:
- ギルド情報
- チャンネルの詳細
- ユーザープロフィール
- ロールデータ
リクエストスロットリングを使用する
リクエストのペースを制御することで、制限に達する前にレート制限を防ぐための積極的なアプローチがスロットリングです。
たとえば、botが200人の新しいメンバーにウェルカムメッセージを送信する必要がある場合、すぐに200通のメッセージを送信するのではなく、100ミリ秒ごとに4つのリクエストを放出するキューに入れてください。 これにより、1秒あたり40件のリクエストという安定したレートが維持され、50件のリクエスト制限を安全に下回りながら、すべてのメッセージが約5秒で送信されることが保証されます。
グローバルレート制限
グローバルレート制限に引っかかる場合、あなたのプログラムには対処すべき根本的な問題があるかもしれません。
制限内に収めるためのコード最適化方法は次のとおりです:
- 適切なキャッシングの実装
- インタラクションベースの機能に移行する
これらのソリューションがグローバルレート制限の問題を解決しない場合は、Discord Developer Serverの#api-helpチャンネルでお問い合わせいただくか、Developer Supportにご連絡いただくことをお勧めします。
ゲートウェイの考慮事項とシャーディング
botがDiscordのゲートウェイ(WebSocket接続)を介してリアルタイムイベントを処理する場合、botが成長するにつれてシャーディングが不可欠です。
シャーディングとは何ですか?
シャーディングは、botを複数のインスタンスに分割し、それぞれがギルドのサブセットを処理します。 この処理により、複数のWebSocket接続に負荷が分散され、レート制限内に留まることができます。
ギルドの数が2,000に近づいたら、シャーディングの実装計画を始めることをお勧めします。シャーディングは2,500以上のギルドで必ず有効にする必要があります。 最適なパフォーマンスを得るには、約1,000のギルドごとに1つのシャードを維持するというベストプラクティスに従ってください。
全てのDiscordユーザーに対して安定した体験を保証するために、レート制限が存在することを忘れないでください。 これらのベストプラクティスに従うことで、制限を尊重しながら効果的にスケールするBotを構築できます。