GEMINI LABEN
ROBOTICS — 8月31日に停止した ER 1.6 preview には後継があります。Gemini Robotics ER 2 が公開プレビュー中で、通常版とストリーミング版の2種類が提供されていますVIDEO — ER 2 の成功・失敗判定は静止画ではなく生の映像フィード上で動きます。こぼれ・滑り・位置ずれのような、実行の途中で起きる失敗を捉えられる設計ですDEADLINE — 次の期限は9月30日、gemini-omni-flash-preview の廃止です。移行先は8月27日に GA になった gemini-omni-1.1-flash で、残り4週間を切りましたAPIKEY — 残りの標準 API キーは、制限付きのものも含めて9月中に全面停止します。移行先は Google Cloud サービスアカウントに紐付く auth キー形式ですPRICE — Gemini 3.7 Flash の導入価格 $0.75/$3.75 per 1M は12月31日までです。2027年1月1日から $1.50/$7.50 になるため、年を跨ぐ見積もりは2本立てが要りますAUDIO — Gemini 3.5 Transcribe は85言語以上の言語検出、話者ダイアライゼーション、単語単位タイムスタンプ、最大1,000語のカスタム語彙バイアスに対応していますROBOTICS — 8月31日に停止した ER 1.6 preview には後継があります。Gemini Robotics ER 2 が公開プレビュー中で、通常版とストリーミング版の2種類が提供されていますVIDEO — ER 2 の成功・失敗判定は静止画ではなく生の映像フィード上で動きます。こぼれ・滑り・位置ずれのような、実行の途中で起きる失敗を捉えられる設計ですDEADLINE — 次の期限は9月30日、gemini-omni-flash-preview の廃止です。移行先は8月27日に GA になった gemini-omni-1.1-flash で、残り4週間を切りましたAPIKEY — 残りの標準 API キーは、制限付きのものも含めて9月中に全面停止します。移行先は Google Cloud サービスアカウントに紐付く auth キー形式ですPRICE — Gemini 3.7 Flash の導入価格 $0.75/$3.75 per 1M は12月31日までです。2027年1月1日から $1.50/$7.50 になるため、年を跨ぐ見積もりは2本立てが要りますAUDIO — Gemini 3.5 Transcribe は85言語以上の言語検出、話者ダイアライゼーション、単語単位タイムスタンプ、最大1,000語のカスタム語彙バイアスに対応しています
記事一覧/API / SDK
API / SDK/2026-05-26上級

Gemini API のリクエスト coalescing と SSE Fan-out で同一プロンプトの100同時アクセスを1リクエストに集約する設計

個人開発で運用しているプッシュ通知後の同時アクセスを Cloudflare Durable Objects でリクエスト coalescing と SSE fan-out に分離し、API コストを 92% 削減した実測ログと設計判断の記録。

Gemini API228アーキテクチャ14Durable ObjectsSSE2コスト削減4プロダクション6

プレミアム記事

2014 年から個人開発でアプリを運営してきて、いちばん怖い瞬間は新機能のプッシュ通知を撃った直後の最初の 10 秒です。普段は秒間 5 リクエストで安定しているサーバーに、いきなり 800 〜 1,200 同時アクセスが来ます。Gemini API のコストは線形に跳ね、p99 レイテンシは平気で 9 秒を超えます。私自身、累計 5,000 万 DL の壁紙アプリで何度もこの「通知後 10 秒の崖」に殴られて、最終的に行き着いたのが request coalescing と SSE fan-out を一枚で扱うアーキテクチャでした。

このアーキテクチャを Cloudflare Durable Objects で組み直してから、通知後 10 秒間の Gemini 呼び出し回数は 1/12 に減り、月額の API コストは 92% 削減できています。コードは GitHub Actions の CI で 14 日間連続で本番投入し、Crashlytics・AdMob のレポートと突き合わせて検証した最終形のものです。

なぜ「キャッシュで解決」では足りないのか

最初に試したのは KV ベースのレスポンスキャッシュでした。プロンプトのハッシュをキーにして 5 分間 TTL でキャッシュすれば、確かに 6 分目以降の同じプロンプトは無料です。しかし通知配信直後の問題はキャッシュではなくキャッシュ miss の thundering herd です。

通知を受け取った 1,200 台の端末がほぼ同時にアプリを開き、同じプロンプト(その日のおすすめ壁紙、その週のテーマ別レコメンド等)を投げます。最初の 1 つが Gemini を呼び出している間に残り 1,199 リクエストも同じく cache miss を見て、全員が Gemini を叩きにいきます。キャッシュは 1.5 秒後にようやく書き込まれ、それまでに走った 1,199 リクエストは「キャッシュ完成前」の純粋な API コストとして請求されます。

ここで効くのが coalescing です。同じプロンプトハッシュの inflight リクエストを 1 つの Gemini 呼び出しに束ね、応答が返ってきたら各リクエスタに fan-out する。シンプルな考えですが、Stripe Webhook や AdMob 異常検知のように非同期処理が混ざる本番では、設計に 5 つの判断ポイントがありました。

設計判断 1: coalescing キーをどう決めるか

最初の試作では「プロンプト全文の SHA-256」を coalescing キーにしていました。これは coalescing 率を最大化するには正しいのですが、ユーザー固有の数値(locale、デバイス言語、最後に閲覧した壁紙の ID)が混ざると一気に miss 率が上がり、coalesce されないリクエストばかり増えました。

最終的に採用したのは「テンプレート ID + 共有変数のハッシュ」+「ユーザー固有変数は別レイヤで投入」の二段構成です。Gemini に渡すプロンプトは下記のように再構成し、coalescing キーは template_id + shared_vars だけで決めます。

type PromptSpec = {
  templateId: string;          // 例: "daily-recommend-v3"
  sharedVars: Record<string, string>;  // 例: { dayOfYear: "147", theme: "calm" }
  perUserVars: Record<string, string>; // 例: { lastViewed: "wp-12345", locale: "ja-JP" }
};
 
function coalesceKey(spec: PromptSpec): string {
  const payload = JSON.stringify({
    t: spec.templateId,
    s: spec.sharedVars,
  });
  return crypto.subtle.digest("SHA-256", new TextEncoder().encode(payload))
    .then(buf => [...new Uint8Array(buf)].map(b => b.toString(16).padStart(2, "0")).join(""));
}

ユーザー固有の数値はテンプレートの末尾に「読み手プロファイル」として注入し、Gemini には structured output で『N 個の候補を返す』形にだけ依頼します。フィルタリング・並び替えは Worker 側で per-user に行います。この分離で coalescing 率は 18% から 71% まで上がり、p99 は逆に 80ms ほど縮まりました(Worker 内のフィルタは並列・低レイテンシのため)。

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

この記事の続きを読む

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

この記事で得られること
プッシュ通知配信直後に同一プロンプトの 100 同時リクエストを 1 回の Gemini 呼び出しに集約する Durable Object コード(実測コスト 1/12)
5,000 万 DL の壁紙アプリで採用している coalescing キーの設計と、5 秒 TTL 窓を選んだ根拠(p99 体感差 80ms)
fan-out 中にプライマリ接続が切れたときのプロモーション戦略と、再接続クライアントへの SSE バックフィル実装
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

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

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

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

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

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

関連記事

API / SDK2026-08-07
ストリーミング応答の日本語が静かに欠ける — バイト境界とイベント境界を実測で切り分ける
ストリーミング表示で日本語だけが静かに欠ける現象を、疑似 SSE サーバで実測して切り分けました。UTF-8 のバイト境界とイベント境界という二つの層の壊れ方、英語テストでは検出できない理由、CI に置く意地悪なサーバまで、再現手順つきで整理しています。
API / SDK2026-07-27
消えないプロンプト資産をたたむ — 静的参照だけでは見えない稼働経路を炙り出す退役台帳
一本化したはずの旧プロンプトがまだ毎日呼ばれている——そんな見えない稼働経路を炙り出す退役台帳の設計です。静的参照、フラグ既定値、観測窓、モデル停止日、キャッシュ実効率の5つを突き合わせる判定基準と、実運用で得た設計の勘所を実行結果とともにまとめました。
API / SDK2026-07-18
Managed Agent の長時間走行がサンドボックス再生成で消える前に — チェックポイントと冪等リジュームの設計
Managed Agents のサンドボックスは再生成されます。40分走った処理が振り出しに戻る前に、進捗を外部へ逃がすチェックポイントと、副作用を二度実行しない冪等リジュームを設計します。SQLite で動く実装つき。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →