shiichan

実行時ロードのコードも耐久実行!@cloudflare/dynamic-workflows が登場!

やっほー、しぃちゃんだよ!今日はサーバーレスがまたひとつ賢くなるお話を持ってきたよ。

Cloudflare Changelog developers.cloudflare.com

なにが発表されたの?

Cloudflare の Changelog からのお知らせだよ。@cloudflare/dynamic-workflows っていう新しいライブラリを使うと、Dynamic Worker の中で Workflow を動かせるようになったの。実行時に読み込まれるコードでも、ちゃんと耐久実行(durable execution)ができるのがポイントだよ。

今までどうだったの?

Worker Loader は Dynamic Workers を必要なときにオンデマンドで読み込む仕組みなんだけど、ここに耐久性の難しさがあったの。Workflow はステップとステップの間で何時間も、ときには何日も眠ることがあるよね。目を覚ました頃には、最初に読み込んだ Dynamic Worker のコードはもうメモリに残っていない…。これだと続きを動かせなくて困っちゃう。

これで何が変わるの?

このライブラリは、各 Workflow インスタンスに「どの Dynamic Worker を読み込めばいいか」を示すメタデータ(たとえばテナント ID)をタグ付けしておくの。そして Workflow が目を覚ましたときに、Worker Loader 経由でぴったりの Dynamic Worker を読み直してくれるんだよ。

Dynamic Workers はオンデマンドで作られるから、Workflow を 1 つずつ事前登録したり個別に管理したりしなくていいの。永続化やリトライは Workflows エンジンが裏でぜんぶ面倒を見てくれて、Workflow のコード自体はいつも通りに書けるのがうれしいところ。

こんな場面で活躍しそうだよ:

  • テナントごとに独自の自動化(オンボーディングや承認フロー、請求リトライなど)を持つ SaaS プラットフォーム
  • 実行時に複数ステップの計画を組み立て、再起動をまたいだり人の承認を待ったりする AI エージェント基盤
  • お客さんが自分の処理ロジックを投げ込み、ステップごとに進捗を保存するマルチテナントなジョブ処理

深く潜ってみよう

使い方はこんな感じで、createDynamicWorkflowEntrypoint でエントリポイントを作るよ。

import { createDynamicWorkflowEntrypoint } from "@cloudflare/dynamic-workflows";

export const DynamicWorkflow = createDynamicWorkflowEntrypoint(
  async ({ env, metadata }) => {
    const stub = loadTenant(env, metadata.tenantId);
    return stub.getEntrypoint("TenantWorkflow");
  },
);

ここで作るエントリポイントの名前は、Wrangler 設定の workflows バインディングの class_name と一致させる必要があるよ。テナントのコードを読み込むときに wrapWorkflowBinding で包んでおくと、以降の create() には自動で { tenantId } のタグが付くから、あとはふつうの Workflow バインディングと同じように使えるの。もっと詳しい流れは Dynamic Workflows のガイド を見てね。

まとめ

  • @cloudflare/dynamic-workflows で、Dynamic Worker の中でも Workflow を耐久実行できるようになったよ
  • Workflow インスタンスにメタデータをタグ付けして、目覚めたときに正しい Dynamic Worker を読み直す仕組み
  • 事前登録なしでテナントごとの Workflow が動かせて、永続化とリトライはエンジンにおまかせ
  • マルチテナントな SaaS や、実行時にコードを組み立てる AI エージェント基盤を作っている人にぴったりだよ!