◉CLAUDE LABEN
●2.1.301 — vim の % モーション、VS Code パネルでの LaTeX 数式表示、使用量上限待ちのリトライ監視の上限が入りました(10/15)●2.1.299 — 200K トークン超で約54分放置した会話はアイドル圧縮。MCP の許可ルールは名指ししたサーバーだけに一致します●SONNET 4.5 — Claude API での提供終了は 11/30、残り45日。移行先は Sonnet 5.5●WINDOWS — 日本語の環境でだけフックが黙って壊れる報告があり、文字コードの確認が呼びかけられています●FAST MODE — Opus 5.5 の Fast mode がリサーチプレビューを終え、ベータヘッダーが不要になりました(10/15)●NEW — Cowork に渡したフォルダの先頭に、十行の約束ファイルを置いてみました●2.1.301 — vim の % モーション、VS Code パネルでの LaTeX 数式表示、使用量上限待ちのリトライ監視の上限が入りました(10/15)●2.1.299 — 200K トークン超で約54分放置した会話はアイドル圧縮。MCP の許可ルールは名指ししたサーバーだけに一致します●SONNET 4.5 — Claude API での提供終了は 11/30、残り45日。移行先は Sonnet 5.5●WINDOWS — 日本語の環境でだけフックが黙って壊れる報告があり、文字コードの確認が呼びかけられています●FAST MODE — Opus 5.5 の Fast mode がリサーチプレビューを終え、ベータヘッダーが不要になりました(10/15)●NEW — Cowork に渡したフォルダの先頭に、十行の約束ファイルを置いてみました
記事一覧/API & SDK
⬡ API & SDK/2026-05-23上級

Claude API のジョブキューに優先度と公平性を組み込む設計 — 5,000万DL個人開発で実装したバックプレッシャーの実践

Claude API を本番運用すると必ず詰まる「長文1リクエストが短文100リクエストを止める」問題に、3層プライオリティキューと DRR で公平性を入れた実装の話です。アーティスト・個人開発者の廣川政樹が5,000万DLアプリで運用してきた構成を、コードと運用メトリクスとともに共有します。

claude-api83priority-queuefair-schedulingbackpressureproduction87

✦ プレミアム記事

Claude API を組み込んだ機能を本番で動かし始めて1年が経ったあたり、自分のサーバが落ちる原因のほとんどは「Claude が遅い日」ではなく「リクエストが詰まる順序」にあると気付きました。きっかけは、私が個人で運営しているアプリのレビュー自動返信ワーカーで、ある朝だけ App Store の英語レビューが大量に届き、その背後で日本語レビューが90分待たされていた、という小さな事故です。

レビュー件数を数えると、その朝は英語側に 1 件あたり 18,000 文字を超える長文レビューが 3 件入っていて、それぞれの Claude API 呼び出しに 12〜18 秒かかっていました。一方で日本語側は 1 件あたり 600 文字前後で、本来なら 1.5 秒で返るはずのジョブが、先にキューに入った長文 3 件の後ろに並んだまま動けなくなっていたのです。FIFO(先入先出)で処理する素朴なワーカー設計が、ピーク時に短文ユーザーを犠牲にしていました。

この記事は、そこから半年かけて自分のワーカーに優先度と公平性を入れていった設計の話です。Claude の公式 SDK には「並列リクエスト数を絞れ」「リトライを設計しろ」と書いてありますが、複数テナント・複数優先度・長文と短文の混在を本番で 1 年捌くと、それだけでは足りないことが見えてきます。今日は、私が実際に組んだ 3 層プライオリティキューと、DRR(Deficit Round Robin)でテナント間の公平性を保証する仕組みを、コードと運用メトリクスごと共有します。

なぜ「リクエスト順」で処理してはいけないのか — 詰まる構造の正体

最初の素朴な設計は、Redis の LIST に enqueue して、ワーカー 4 並列で BRPOP するだけの FIFO でした。Claude API の messages.create は同時実行 4 本までという自分のレート上限に収まっていて、平常時はこれで何の問題もありません。

ところが、入力トークン量が極端に偏ると、この設計は機能しなくなります。具体的には次のような状況が起きます。

  • 長文ジョブ(18,000 文字 = 約 9,000 入力トークン)の処理時間は中央値 12.4 秒、p99 で 21.8 秒
  • 短文ジョブ(600 文字 = 約 300 入力トークン)の処理時間は中央値 1.5 秒、p99 で 3.2 秒
  • 4 並列ワーカーが全て長文を掴むと、その後に来た短文ジョブは最大 22 秒待たされる

平常時に「短文 100 件のスループット」と「長文 3 件のスループット」を比較すると、後者が前者を完全に支配します。これは Head-of-Line Blocking と呼ばれる典型的な問題で、ネットワーク機器やデータベースの世界では古典的に解かれていますが、Claude API ワーカーでも全く同じことが起こります。

私の場合、最も顕在化したのは「ユーザーが Discord で『なんで返事こないの?』と聞いてきた」という形でした。レビュー返信は SLA を持たない非同期処理だと思っていたのですが、実際にはユーザーは数分待つだけで不安になります。FIFO は公平に見えて、最も多数の短文ユーザーを継続的に犠牲にする設計だったわけです。

設計の3つの目標 — レイテンシ・スループット・公平性のトレードオフ

詰まりを直すために、私は次の 3 つを設計目標に置き直しました。順番が大事で、上から優先します。

  1. クリティカル経路の即時応答: ユーザー操作起点のリクエスト(例: アプリ内の「AI に聞く」ボタン)は p99 で 2 秒以内に返したい
  2. テナント間の公平性: あるテナント(私のアプリ群でいうと「あるアプリ ID」)が大量投入しても、他のテナントの平均待ち時間を 1.5 倍以内に抑える
  3. バッチスループットの最大化: 夜間に走る一括処理は、上 2 つを侵害しない範囲で全力スループットを出す

この 3 つは互いにトレードオフです。1 を完璧にやろうとすると 3 が止まり、2 を強くすると 1 のテール(長文の遅延)が増えます。本番で 1 年回した結果、私はこの 3 つを以下のように工学的に分担させました。

  • 1 は「3 層プライオリティキュー」で、critical キューを他に優先する形で解決
  • 2 は「DRR(Deficit Round Robin)」で、テナント単位のクォータを毎ラウンドで補充する形で解決
  • 3 は「batch キューに最低保証スループットを与える」と「message_batches API を併用する」の二段構えで解決

ここから先は実装の話です。コードは Python の asyncio ベースですが、Node.js や Go でも同じ構造で書けます。

✦

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
✦3層プライオリティキュー(critical/standard/batch)と DRR を組み合わせた具体的な実装コード(Python・約180行)
✦p99 レイテンシを 11.2 秒 → 1.8 秒に短縮した実測値と、その背景にある飢餓回避の設計判断
✦429 / Retry-After を尊重しながら『予算超過テナント』を自動降格する仕組みと、本番で踏んだ4つの落とし穴
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Claude Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • ✦コピー&ペーストで使える実装コード付き
  • ✦毎日新しい上級ガイドを追加
  • ✦¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

⬡ API & SDK2026-05-26
Claude API の構造化レスポンスを本番で安定させる — tool_use と JSON Schema、多層検証の実装メモ
Claude API の応答を JSON で受け取る実装は数行で書けますが、本番運用では「形は正しいが意味が壊れている」レスポンスにどう備えるかが分かれ目になります。tool_use・JSON Schema・ドメイン検証を組み合わせた多層パイプラインを、壁紙アプリの分類処理での実体験を交えて整理しました。
⬡ API & SDK2026-05-22
Claude API の tool_result could not be submitted が再発しないための回復ハンドラ設計
Claude API でエージェントを長時間動かしていると、ある日突然 'tool_result could not be submitted' が連発し始めることがあります。再試行しても直らない、ストリーミング途中で死ぬ、そして次のセッションでもまた出る — 常時稼働のエージェント基盤で実際に踏み抜いた4種類の原因と、TypeScript で書いた回復ハンドラの実装を整理しました。
⬡ API & SDK2026-05-19
Claude API のチャット履歴を階層サマライズする:3 段階圧縮でトークンを 70 % 削減した設計
壁紙アプリのインアプリ AI チャットで増え続ける履歴トークンを抑えるため、直近ターン・中期エピソード・長期エンティティの 3 層に分けて圧縮する設計を、TypeScript の動くコードと 7 週間の運用データつきで記録しました。月額 API 費用を $480 から $145 まで下げています。