「TF400733: The request has been canceled: Request was blocked due to exceeding usage of resource」
Azure DevOps Services は、1つのアカウントや1つのパイプラインが共有のサービスにかける負荷に上限を設けています。上限を超えると、まず要求を遅らせ、続いて HTTP 429 とこの文で断ります。文には、使い切ったリソースと名前空間が入ります。問題は要求そのものではなく、そのアカウントの直近の使用量です。使用量が下がれば、遅れは5分以内に止まります。Microsoft の Rate and usage limits と Monitor usage からまとめました(いずれも英語)。
上限
- 負荷は TSTU(Azure DevOps throughput units)で数えます。データベース・計算・ストレージの使用を混ぜた単位で、1 TSTU はふつうの利用者の5分間の平均の負荷です。ふつうの使い方なら5分で10以下に収まります。
- 上限は直近5分(ずれていく窓)で200 TSTU。アカウントごとで、パイプラインもそれぞれ別に同じ上限です(自分で用意したエージェントでも、クローンやログの送信は負荷に数えられます)。
- 遅れは1要求あたり数ミリ秒から30秒まで。使用量が下がれば5分以内に止まります。大きく遅らされると、そのアカウントにメールが届き、Web に警告の帯が出ます。ビルド サービスなどメールアドレスの無いアカウントの分は、Project Collection Administrators にメールが届きます。
- もっと使う必要のある ID は、アクセス レベルを Basic + Test Plans にすると上限が上がります(上がるのはこのレベルだけ・割り当てている間だけ課金)。
- この上限は Azure DevOps Services について書かれたものです。同じ文は、Visual Studio Marketplace への公開(vsmarketplace #2256・VSID Concurrency)や、2020年の GitHub Actions のキャッシュ(#68)の公開の報告にも出てきます。このページは Azure DevOps そのものの話です。
止まる前の知らせ
Azure DevOps は次の応答ヘッダーを返します。X-RateLimit-Delay 以外は、遅らせ始める前から来るので、クライアントは間に合ううちに速さを落とせます:
Retry-After:次の要求まで待つ秒数。HTTP 200 と一緒に来ることもあります。X-RateLimit-Resource:どのサービスのどの上限か。人が読むためのもので、プログラムで判断には使わない、とされています。X-RateLimit-LimitとX-RateLimit-Remaining:遅らせ始めるまでに使える TSTU と、その残り(遅れや遮断が始まっていれば0)。X-RateLimit-Reset:今すぐ全部の使用をやめたら、数えている使用量が0に戻る時刻(Unix 時間)。X-RateLimit-Delay:この要求が遅らされた秒数。X-RateLimit-Cost(ある時だけ):この要求が使った TSTU。
何が使ったかを探す
組織の設定(Organization settings)の使用状況(Usage・Project Collection Administrators だけ)に、最初は直近1時間の要求が並びます。利用者ごと・パイプラインごと・よく使われたユーザー エージェント・よく使われたコマンドで見られ、要求ごとに TSTU・遅れ・状態(Normal・Delayed・Blocked)が出ます。表示は最初に遅らされた要求の前後30分が中心です。ユーザー エージェントとコマンドから、たいていスクリプトや道具が分かります。
スクリプトや道具を上限の内に収める
- 429 が来たら
Retry-Afterの秒数だけ待ってから次を送ります。200 にRetry-Afterが付いて来た時も同じです。 X-RateLimit-Remainingを見て、まとめ打ちを散らします。- 頼む量を減らします:1件ずつ呼ばずに一覧を1回で、全部を読まずに
$topと絞り込みで、見回りの間隔は長めに。 - 重い自動処理には専用の ID を与え、同じアカウントを使う人まで止めないようにします。
IntelliJ IDEA・Rider などの JetBrains IDE では
Azure DevOps Pull Requests は、JetBrains IDE(2024.1 以降)と Android Studio のプルリク用プラグインです。ツールウィンドウを開いている間の5分ごとの読み直しでは、プルリクの一覧と、そのうち最大100件のコメントのスレッドを、4件ずつ並べて読みます。Azure DevOps に断られた時は Azure DevOps 自身の文を添えてそう知らせ、Retry-After の秒数のあいだその組織には何も送らず、残りのスレッドもその間は読みません。読み直しは 設定 | ツール | Azure DevOps Pull Requests で止められます。読むのは無料、投票・コメント・完了は Pro(30日間の無料試用つき)です。
Azure DevOps は Microsoft Corporation の商標、IntelliJ IDEA は JetBrains s.r.o. の商標です。このページは Microsoft・JetBrains のいずれとも提携しておらず、承認も受けていません。
ほかに:「API resource location … is not registered on …」 · TF400813 · 全組織用の個人用アクセストークンの廃止 · English