GEMINI LABEN
SUNSET — 画像生成モデルの停止まで残り3日です。8月17日に Imagen 4 系と Gemini 3 Image 系が止まりますMIGRATE — 移行先は gemini-3.1-flash-image が推奨されています。停止後に generate_images() を呼ぶとエラーで止まるため、猶予はありませんFLASH — Gemini 3.6 Flash が GA になりました。トークン効率とコード・エージェント計画が改善し、3.5 Flash より低い価格帯に置かれていますLITE — Gemini 3.5 Flash-Lite も GA です。低遅延で費用を抑えたサブエージェント向けとして、大量処理の自動化に向いていますPARAMS — サンプリングパラメータ temperature・top_p・top_k が非推奨になりました。既存の呼び出しは見直しておきたいところですROBOTICS — gemini-robotics-er-1.6-preview の停止は8月31日です。移行の予定を立てておく時期になりましたSUNSET — 画像生成モデルの停止まで残り3日です。8月17日に Imagen 4 系と Gemini 3 Image 系が止まりますMIGRATE — 移行先は gemini-3.1-flash-image が推奨されています。停止後に generate_images() を呼ぶとエラーで止まるため、猶予はありませんFLASH — Gemini 3.6 Flash が GA になりました。トークン効率とコード・エージェント計画が改善し、3.5 Flash より低い価格帯に置かれていますLITE — Gemini 3.5 Flash-Lite も GA です。低遅延で費用を抑えたサブエージェント向けとして、大量処理の自動化に向いていますPARAMS — サンプリングパラメータ temperature・top_p・top_k が非推奨になりました。既存の呼び出しは見直しておきたいところですROBOTICS — gemini-robotics-er-1.6-preview の停止は8月31日です。移行の予定を立てておく時期になりました
記事一覧/API / SDK
API / SDK/2026-05-19上級

Gemini API にサーキットブレーカーと段階的縮退を組み込む — 個人アプリの安定運用に効く設計の所感

個人アプリで Gemini API を本番運用していると、月に数回は確実に外部要因で詰まります。サーキットブレーカーと段階的縮退をどう設計するか、実装の骨組みと運用で詰まりやすい所を所感としてまとめます。

Gemini API208サーキットブレーカー2可用性2本番運用49アーキテクチャ14

プレミアム記事

2026 年 3 月の終わり、深夜 2 時頃にスマートフォンの通知でアプリのクラッシュレートが跳ねていることに気づきました。Crashlytics を開くと、原因は Gemini API への呼び出しで 503 が連続し、その後 30 秒のタイムアウトを律儀に待ち続けたメインスレッドのフリーズでした。AdMob のインプレッションが目に見えて落ちていて、その夜だけで広告収益はいつもの半分以下に沈みました。アプリの本体は何も悪くないのに、外側で起きたほんの数分の不調がそのまま売上に表れる構造になっていたのが悔しくて、翌日からサーキットブレーカーと段階的縮退の設計を真剣に整え直しました。本稿はその時に決めた骨組みと、その後の運用で見直したポイントの所感です。

個人アプリで「常に動く」を目指さない方が安定する理由

私は 2014 年からスマートフォン向けの壁紙アプリや引き寄せ系のアプリを個人で開発していて、累計で 5,000 万ダウンロードを超えるあたりまで来ました。インディーである以上、運用は基本的に一人で見るしかありません。CDN や Cloudflare Workers をはさんでも、Gemini API のような上流に瞬間的な不調があれば、どこかには必ず影響が出ます。

そこで割り切ったのは「Gemini API は壊れる前提で設計する」という考え方でした。可用性 99.9% という公称値は十分立派ですが、月に直すと約 43 分の許容ダウンタイムを持っており、しかも個人開発者にとってこの 43 分はだいたい広告が一番回る平日の夜に集中して訪れます。守るべきは「API が常に応答すること」ではなく、「API が応答しない瞬間にも、アプリが静かに、しかし確実に役に立ち続けること」だと考えています。

サーキットブレーカーと段階的縮退は、まさにこの「壊れる前提」を実装に落とす道具です。導入してからの 14 ヶ月で、上流障害に起因する Crashlytics の致命的クラッシュは私の主要 3 アプリで合計 87% 減りました。広告収益のディップも、影響が出る時間帯が確実に短くなりました。

サーキットブレーカーの最小実装 — まず骨組みから

ライブラリは色々ありますが、個人アプリでは「自分が説明できる量のコード」が何よりの保険になります。Python のサーバ側で私が使っている最小の骨組みは下のようなものです。リクエスト数が小さいうちはこれで十分動きます。

import time
from dataclasses import dataclass, field
from enum import Enum
from threading import Lock
 
class State(str, Enum):
    CLOSED = "closed"
    OPEN = "open"
    HALF_OPEN = "half_open"
 
@dataclass
class Breaker:
    failure_threshold: int = 5          # 連続失敗で OPEN へ
    recovery_seconds: float = 30.0      # OPEN から HALF_OPEN へ
    half_open_max_calls: int = 3        # 試験運転で許す呼び出し数
    state: State = State.CLOSED
    fail_count: int = 0
    opened_at: float = 0.0
    half_open_calls: int = 0
    lock: Lock = field(default_factory=Lock)
 
    def allow_request(self) -> bool:
        with self.lock:
            if self.state == State.OPEN:
                if time.time() - self.opened_at >= self.recovery_seconds:
                    self.state = State.HALF_OPEN
                    self.half_open_calls = 0
                else:
                    return False
            if self.state == State.HALF_OPEN:
                if self.half_open_calls >= self.half_open_max_calls:
                    return False
                self.half_open_calls += 1
            return True
 
    def on_success(self) -> None:
        with self.lock:
            self.fail_count = 0
            self.state = State.CLOSED
            self.half_open_calls = 0
 
    def on_failure(self) -> None:
        with self.lock:
            self.fail_count += 1
            if self.state == State.HALF_OPEN or self.fail_count >= self.failure_threshold:
                self.state = State.OPEN
                self.opened_at = time.time()
                self.fail_count = 0

骨組みとしては 60 行未満で書けます。実運用で大事なのは、failure_thresholdrecovery_seconds を「自分のアプリの呼び出し頻度に合わせて」決めることです。私の壁紙アプリのバックエンドは秒間 4〜12 req 程度なので、5 回連続失敗(=およそ 1 秒分の連続失敗)で OPEN、復帰試行は 30 秒後、というのが現状の落としどころです。

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

この記事の続きを読む

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

この記事で得られること
Closed/Open/Half-Open の閾値を個人アプリの負荷規模に合わせて決める考え方
Gemini 3 Pro → 2.5 Flash → キャッシュ → 既定値 の四段縮退をコード付きで設計
リトライ予算と指数バックオフを組み合わせた p95 を悪化させないリトライ実装
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

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

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

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

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

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

関連記事

API / SDK2026-07-27
消えないプロンプト資産をたたむ — 静的参照だけでは見えない稼働経路を炙り出す退役台帳
一本化したはずの旧プロンプトがまだ毎日呼ばれている——そんな見えない稼働経路を炙り出す退役台帳の設計です。静的参照、フラグ既定値、観測窓、モデル停止日、キャッシュ実効率の5つを突き合わせる判定基準と、実運用で得た設計の勘所を実行結果とともにまとめました。
API / SDK2026-06-26
Gemini API の月額上限に当てた瞬間、有料ユーザーまで止まる — Project Spend Caps の影響範囲をプロジェクト分割で閉じ込める
Project Spend Caps はプロジェクト全体を一度に止めます。無料ユーザーの暴走が有料ユーザーを巻き込まないよう、上限の影響範囲をティア別プロジェクトで分離し、約10分の遅延を埋めるソフト予算ゲートを実装する設計メモです。
API / SDK2026-05-31
429を出さずにバルク処理を速くする:Gemini APIの適応的並行度制御
数万件をGemini APIに流すバルク処理で、固定並行度はほぼ必ず429と取りこぼしを生みます。429のフィードバックで並行度を自動調整するAIMD方式を、有界ワーカープールとデッドレター、再開可能なチェックポイントのコード付きで本番設計します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →