Discordボットを公開したことがある人なら、必ず一度は経験しているでしょう。普通の火曜日だったのに、突然すべての場所でincreased api errorsが表示され、コマンドの半分が失敗します。2026年半ば、Google Trendsはこのフレーズを急上昇の検索語として記録しました。エンドユーザーが直接検索するほど、頻繁に起きているということです。ここでは、この事態を乗り切る方法と、Noxyrサーバー APIがそこから得た教訓を説明します。

A request gets a 429, waits out a countdown, then retries and succeeds with a 200. Server 429 200 3 2 1 Retry-After

Discord APIの失敗パターン3つ

  • 全体的な障害/部分的な障害:discordstatus.comで確認できます。症状としては、どのリクエストも失敗する可能性があり、ゲートウェイが切断されたり、全体的にレイテンシが急上昇したりします。
  • 429 Too Many Requests:バケットの上限を超えています。DiscordはRetry-Afterヘッダーを返し、どれだけ待つべきかを正確に伝えます。
  • ゲートウェイの無効なセッション:WebSocketセッションが古くなっています。再開トークンで再接続してください。それが失敗した場合は、新しくIdentifyを行います。

晴れた日ではなく、失敗に備えて作る

  • Retry-Afterを尊重する。独自のタイマーで再試行しないでください。Discordが指定した時間だけ待ってから、1回だけ再試行します。429を連続して受けても押し通そうとするボットは、BANされます。
  • ジッター付きの指数バックオフ。5xxエラーの際は、1秒、2秒、4秒、8秒と待ち、さらに小さなランダムなずれを加えます。再起動が一斉に行われても、殺到しないようにするためです。
  • 重要でない呼び出しはサーキットブレーカーで止める。ボットが毎週のダイジェストを投稿していて、Discord APIが劣化している場合は、その回をスキップしてください。無理に押し込むのは避けます。ダイジェストは待てますが、障害は待ってくれません。
  • リアルタイムでないものはキャッシュする。サーバー名、チャンネル一覧、ロールIDなどはローカルにキャッシュしてください。障害中も、キャッシュされたデータがあれば応答を続けられます。
  • 状況を表示する。Discordの障害でボットのコマンドが失敗しているなら、ユーザーに伝えてください。「Discordで現在問題が発生しています」という1行があれば、無言のタイムアウトより親切です。

Noxyrサーバー APIがこれらの教訓をどう適用しているか

Noxyrサーバー APIはDiscord APIそのものではなく、自身のデータベースを読み取ります。それでも同じ原則が当てはまり、その設計を形作っています。

  • 予測可能なエラー:すべての失敗は、安定したerrorコードを持つJSONで返されます。HTMLも、形式がばらばらな応答もありません。
  • レート制限ヘッダー:標準化されたRateLimit-*ヘッダーを返すため、クライアントは429に達する前にバックオフできます。
  • 緩やかな機能縮退:/api/v1/serverエンドポイントは、基盤となるDiscordの取得が失敗した場合、キャッシュされたサーバーデータにフォールバックします。
  • 連鎖的な障害の防止:各エンドポイントは独立して失敗します。Discordがダウンしていても、チケット分析のエンドポイントは壊れません。Discordではなく、Mongoからデータを読み取るためです。
  • 即時に効く無効化スイッチ:キーやスコープを無効にすると、次のリクエストから即座に反映されます。再起動は不要です。

Discordが不安定になったときの手順

  • 1.まずdiscordstatus.comを確認します。自分だけの問題でしょうか?
  • 2.自分のエラーログを確認します。429、5xx、ゲートウェイの切断などです。
  • 3.Discord側の問題であれば、重要でない書き込みを一時停止し、Retry-Afterを守って、回復を待ちます。
  • 4.自分側の問題であれば、直近のデプロイ、キャッシュの無効化、新機能を確認します。
  • 5.状況を共有します。サポートチャンネルに短く正直な告知を出すだけで、100件の重複した報告を防げます。

APIレイヤーの詳細は、Noxyrサーバー API、Discord APIとNoxyr APIの比較、APIの設計原則をご覧ください。