概要
Browser Run を Cloudflare の Containers 上で再構築したことで、利用上限の拡張、パフォーマンスの向上、信頼性の改善を実現しました。Workers バインディング経由で毎分 60 ブラウザを起動でき、同時実行は最大 120 まで — 従来比 4 倍の上限です。さらに Quick Action の応答時間は 50% 以上短縮されました。利用者側での変更は不要で、これらの改善は本日より有効です。加えて、修正や新機能のリリース速度も向上しています。以下で移行の経緯とデータを紹介します。
まず振り返り:Browser Run とは?
Browser Run は開発者が Cloudflare のグローバルネットワーク上で動作するヘッドレスブラウザをプログラム的に操作・やり取りできるサービスです。主な用途は以下の通りです:
- Web アプリのエンドツーエンドテスト
- 疑わしい URL の安全な調査
- ブラウザを用いた PDF レンダリング
- スクリーンショット取得やコンテンツ抽出などの Quick Actions
最近では、AI エージェントがウェブと相互作用するための重要な基盤にもなっています。大規模かつ安全に自動ブラウザを責任を持って活用するための主要プラットフォームを目指して開発しています。
旧インフラの限界(“二段ベッド” を超えて)
従来は Browser Isolation(BISO)とインフラを共有していました。見た目は似ていても、BISO の大きなコンテナイメージは起動や開発を遅くし、グローバルな分散配置も最適ではなく、回復力やレイテンシの面で制約がありました。さらに、BISO の典型的な利用は長時間の安定したセッションであるのに対し、Browser Run は短時間で突発的な負荷が多く、スケーリングや可用性におけるボトルネックを生んでいました。
昨年、Durable Object (DO) 対応 Containers のオープンベータが公開され、社内での採用準備が整ったため段階的な移行を開始しました。自社プラットフォーム上でまず自身が Customer Zero として運用することで、外部顧客に先立って課題を検出して対応できる体制を取っています。
移行プロセス:Containers への段階的導入
まずリクエスト経路に Worker を挿入し、BISO のブラウザと並行して一部ユーザーに Containers ベースのブラウザを提供するデュアルサポートで開発を進めました。これによりパフォーマンス比較や実装バグの切り分けが容易になり、Container 駆動アプローチの利点を確信できました。
採用の段階は次の通りです:
- Quick Actions のエンドポイントをまず Containers ブラウザで提供
- 次に Workers ブラウザバインディング経由で無料アカウントに適用
- 続いて pay-as-you-go(従量課金)アカウントで安定性を検証
- 最終的に残る契約顧客全てへ展開(顧客側のワーカー再デプロイ等は不要)
課題:新プラットフォームの学習とスケールのボトルネック
初期の Containers プラットフォームはドキュメントや観測性が十分でなく、不安定である側面があり、同時に重複タイムゾーンの技術者が少ないといった運用上の挑戦がありました。しかし、私たちが内部の Customer Zero としてフィードバックを回すことでプラットフォーム自体の改善につながり、外部顧客にも恩恵が波及しています。
技術的なハードルとしては、DO によってリクエストに近い場所に Durable Object を作成できる一方で、実際に接続される Container が世界の別の場所で起動するケースが起きます。単発の "start my app" のようなメッセージなら問題ありませんが、WebSocket を張ってスクリーンショットのために何十通りものメッセージを交換する場合は、地理的距離によるミリ秒単位の遅延が積み重なって影響してきます。
解決策
地域ごとの事前ウォーム済み DO バックドのブラウザコンテナプールを作り、DO とコンテナ間の最大距離(=最大レイテンシ)を制約する設計にしました。リクエスト時には、そのリージョン内でユーザーに最も近い DO–コンテナペアを選択します。これにより「ユーザー → DO」と「DO → コンテナ」の両方のホップでレイテンシを低く保てます。全体のアーキテクチャには可動部が増えますが、各ブラウザのグローバルな状態を観測できることにより、需要に応じたキャパシティの割当・再割当が可能になり、この設計は有益だと判断しました。
Workers KV は良いところもあるが限界があった
ヘッドレスブラウザへの需要は昨年の頭から急増しており、AI エージェント開発者の利用が急増して既存キャパシティを超えるリクエスト量が発生しました。ここで問題になったのが Workers KV の最終的一貫性(およそ 30 秒)です。KV を確認して "利用可能" と見えても、実際にそこへルーティングするまで(30 秒後)には既に別のリクエストに取られていることがあり、レースコンディションや過剰割当を招いてスパイクへの迅速なスケールを阻害しました。
KV から D1 + Queues への移行
以前は各コンテナの状態を KV に格納していましたが、キャッシュ TTL により最大で 1 分近い古い状態を参照してしまう可能性がありました(最近 KV の最小キャッシュ TTL は 30 秒に変更されましたが、それでも依然高すぎる)。そのため、コンテナ状態を D1(SQLite ベース)へ移行しました。D1 のトランザクション性はここに最適です。ブラウザをユーザーに割り当てたら排他で保持するため、SQLite トランザクションにより原子的な割当が担保され、同一ブラウザを複数リクエストが同時に取得するレースを防げます。
簡略化したブラウザ取得クエリの例は次の通りです:
WITH candidate_pool AS (
UPDATE containers SET status = 'picked' WHERE sessionId IN (
SELECT sessionId FROM candidate_pool ORDER BY RANDOM() LIMIT ?5
) RETURNING data
各ロケーションに D1 シャードを配置しており、数千のコンテナが稼働する環境では、各コンテナが 5 秒ごとに状態更新を行うためにデータベースを過負荷にしがちでした。例えば各書き込みが 1ms かかるとすると、1,000 回しか書き込み処理が行えず、1 行ごとの書き込みであれば 5,000 コンテナでデータベースが飽和してしまいます。
そこで書き込みをバッチ化しました。バッチ書き込みは個別書き込みと比べて著しく遅くならないため、スループットを桁違いに向上できます。我々は 100 行単位のバッチを採用し、これによりロケーションあたり最大 500,000 コンテナまで更新可能になりました。この余裕によりキャパシティ計画はもはやボトルネックではありません。現在、バッチ書き込みの P95 は 0.1ms です。
書き込みバッチ化にはQueues を利用しています。各コンテナは 5 秒ごとに自身の状態を算出し、そのロケーション専用のキューへメッセージを追加します。ワーカー側のコンシューマを次のように設定します:
{
"queues": {
"consumers": [
{
"queue": "production-core-containers-queue-weur",
"max_batch_size": 100,
"max_batch_timeout": 1,
"max_retries": 1
},
...
]
...
}
}
この構成により、実効的な遅延は 2 秒を大幅に下回る値を達成しています。ただしキューのバックログが溜まると状態が古くなる可能性があり、その場合は各リージョンが指定されたバックアップリージョンへフォールバックしてプライマリキューの追いつきを待ちます。
Quick Actions に対する追加の利点
専用インフラを持てたことで、BISO など他プロダクトに不要な副作用や肥大化を招かずにブラウザコンテナイメージを改良できるようになりました。これによりスクリーンショットやコンテンツ抽出といった Quick Actions の最適化が可能になっています。
従来は Worker がリモートブラウザへ WebSocket を張り、ページを開く → 指定 URL へ遷移 → 読み込み完了を待つ → スクリーンショット取得、という各ステップを逐次的に指示していました。現在は全パラメータを単一の HTTP リクエストとしてコンテナへ送り、処理全体をコンテナ内で完結させるため、Worker とブラウザ間の往復が削減されて遅延が大幅に低下しました。
結果:大幅な性能向上と上限拡大
- Quick Action の平均応答時間は著しく減少しました。
- Workers バインディング経由で毎分 60 ブラウザの起動、同時 120 実行(従来比 4 倍)を達成しました。
- Quick Action の応答時間は 50% 以上短縮されました。
また、リアルタイム状態管理の課題を克服したことで、新機能開発に注力できるようになり、最近公開した /crawl エンドポイントのような拡張も可能になりました。
ブラウザの柔軟性向上
共有の Browser Isolation コンテナから離れたことで、ブラウザのアップグレードサイクルが高速化しました。以前は Chrome のアップグレードに複数チームやプロダクトの調整が必要でしたが、独自のコンテナイメージであればブラウザのバージョンやフラグを自在に制御できます。その結果、要望の多かった WebGL のブラウザベースレンダリング対応や、WebMCP(Model Context Protocol for the web)といった新しいエージェント的相互作用パターンのサポートが可能になりました。
要するに、ブラウザをスケールさせる力を解放したばかりで、特にエージェント開発の分野ではこれからが本番です。ぜひお試しください — docs をご確認ください。
はじめ方
- Browser Run はすべての Workers プランで利用可能です。
- quick start guide から始めるか、Quick Actions を試す、またはサイト内のリンクを辿ってデータを深掘りする
/crawl エンドポイントをお試しください。
- AI エージェントを構築する場合は、Browser Run を組み込んだ Agents SDK をご利用ください。
タグ: server-island-start Developers Developer Platform Browser Run Containers Cloudflare Workers Chrome Agents Browser Rendering Browser Run