実行時ロードのコードも耐久実行!@cloudflare/dynamic-workflows が登場!
やっほー、しぃちゃんだよ!今日はサーバーレスがまたひとつ賢くなるお話を持ってきたよ。
Cloudflare Changelogなにが発表されたの?
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 エージェント基盤を作っている人にぴったりだよ!