shiichan

Cloudflare Workflows が 5 万並列に!コントロールプレーンまるごと作り直しの舞台裏!

みんな、しぃちゃんだよ!今日はインフラの話、それも「動いてるサービスを止めずに土台を丸ごと入れ替えちゃった」っていうワクワクの舞台裏だよ!

Cloudflare Blog blog.cloudflare.com

なにが発表されたの?

Cloudflare の Blog で、Workflows のコントロールプレーン(司令塔にあたる部分)をエージェント時代向けにまるごと作り直した、という発表があったよ。

これによって、同時に走らせられるインスタンスの上限が 4,500 から 50,000 に、1 秒あたりに作れるインスタンス数がアカウントごとに 100 から 300 に、1 つの Workflow でキューに積める数が 100 万から 200 万まで一気に増えたの!

今までどうだったの?

もともと Workflows は「人がポチッと起動する」使われ方を前提に設計されていたんだって。ところが最近は AI エージェントが自律的に動く時代になって、Project ThinkAgents SDK との統合 みたいに、機械のスピードで大量の Workflow が生まれるようになったの。

fewer human-triggered workflows, and more agent-triggered workflows, created at machine speed.

エージェントは何時間も何日も裏で動き続けて、ステップごとのリトライや人の承認待ち、失敗からの復帰みたいな「粘り強い実行」を必要とするよ。1 つのエージェントセッションが数十の Workflow を生んで、複数のエージェントが数秒で数千のインスタンスを作る……そんな世界になったの。

でも V1 の設計だと、アカウントごとに 1 個だけ存在する Account という Durable Object が全部の作成・更新・一覧を仕切っていて、そこがボトルネックになっちゃっていたんだ。

これで何が変わるの?

上限が一気に増えたことで、大量のエージェントを同時にぶん回すようなワークロードでも詰まりにくくなったよ。しかも V2 の新しい上限は「ハードな上限」じゃなくてトグルで切り替えられる設計だから、これからさらに引き上げるときもアーキテクチャを作り直さなくて済むの。

インスタンス一覧の取得も、一貫したカーソルページネーションで速く安定するようになったんだって。

深く潜ってみよう

V2 では役割を分けた新しい登場人物が 2 つ(2 コンポーネント)いるよ。

まず SousChef(スーシェフ=副料理長)。これは 1 つの Workflow の中の「一部のインスタンス」だけの状態とライフサイクルを見る係で、1 アカウントに複数いるの。みんなが Account に効率よく報告するから、singleton だった Account に負荷が集中しなくなるんだ。おまけに Workflow ごとの分離まで手に入ったよ。

次に Gatekeeper。これは同時実行の「スロット」を各 SousChef に配る門番だよ。インスタンスが作られると SousChef が Account にスロットをリースしてもらって、もらえたら実行開始、ダメならキューに入る仕組み。1 秒周期で動いて、スロット要求を 1 回の JSRPC 呼び出しにまとめてくれるから Account が溢れないの。しかも起こされた(再開する)インスタンスを新規作成より優先する max-min 公平性で、みんながちゃんと前に進めるよ。

信頼性のカギは Durable Object の alarm。少なくとも 1 回は実行される&自動リトライされる性質を使って、作成のホットパスに「保険のアラーム」を仕込むの。背景タスクが立ち退き(eviction)やサーバ障害で失敗しても、アラームが後から拾ってインスタンスが宙ぶらりんにならないようにしているんだよ。

Workflow のコードはこんな感じで、ステップ単位の実行やイベント待ちを書けるよ。

export class MyWorkflow extends WorkflowEntrypoint {
  async run(event, step) {
    const data = await step.do("fetch-data", async () => {
      return fetchFromAPI();
    });
    const approval = await step.waitForEvent("approval", {
      type: "approval",
      timeout: "24 hours",
    });
    await step.do("process-and-save", async () => {
      return store(transform(data));
    });
  }
}

そして移行がまたすごいの。数千のお客さんの数百万インスタンスが動いたまま、古い Account DO に SousChef として振る舞うコードを仕込んで、バージョンフラグでコードパスを切り替えたんだって。既存の SQL テーブルをそのまま流用して、走行中の車のタイヤを交換するみたいに無停止で移行しちゃったの!

自分でも触ってみたくなったら、Get Started ガイド最初の durable agent を作るガイド から始められるよ。

まとめ

  • Cloudflare が Workflows のコントロールプレーンをエージェント時代向けに再設計
  • 同時実行 50,000・作成 300 インスタンス毎秒・キュー 200 万まで上限アップ
  • ボトルネックだった Account の singleton を、SousChef と Gatekeeper で水平分割
  • Durable Object の alarm で作成処理を安全にしつつ、重い処理をホットパスから追い出した
  • 走行中の車のタイヤ交換みたいに、無停止で V1 から V2 へ移行

大量のエージェントを裏で走らせたい開発者や、Durable Objects で大規模な分散システムの設計を学びたい人に刺さる話だよ!