@cloudflare/dynamic-workflows ライブラリを使用して Dynamic Workers 内で Workflows を実行
2026年5月1日
@cloudflare/dynamic-workflows ↗ を使用して、Dynamic Worker 内で Workflow を実行できるようになりました。これにより、実行時に読み込まれるコードの耐久性のある実行が保証されます。
概要
Worker Loader は Dynamic Workers をオンデマンドで読み込みますが、これまでは耐久性が課題でした。Dynamic Worker 内でも、Workflow は複数のステップ間で数時間から数日間スリープする可能性があり、再開時には元の Dynamic Worker コードはメモリに存在しなくなります。
このライブラリは、各 Workflow インスタンスにメタデータでタグを付けることで、どの Dynamic Worker を読み込むかを識別し(例:テナント ID)、Workflow が再開するたびに Worker Loader を通じて一致する Dynamic Worker を再読み込みすることで、この問題を解決します。
主な特徴
- Dynamic Workers はオンデマンドで作成されるため、各 Workflow を事前に登録したり、個別に管理したりする必要がありません
- 必要な時点で Dynamic Worker に Workflow コードを読み込むと、Workflows エンジンが背後で永続性と再試行を処理します
- Workflow コード自体はルーティングの影響を受けず、通常通り動作します
ユースケース
これにより、Workflow コード自体が動的なパターンが可能になります。以下の場合に特に有用です:
- SaaS プラットフォーム:各テナントが独自のオートメーション(オンボーディング シーケンス、承認チェーン、請求再試行ロジックなど)を定義する場合
- AI エージェント フレームワーク:エージェントが実行時にマルチステップ プランを生成・実行し、再起動後も存続し、ツール呼び出し間で人間の承認を待つ場合
- マルチテナント ジョブ システム:各顧客が独自の処理ロジックを送信し、すべてのステップが進捗を永続化し、失敗時に再試行する場合
実装例
import {
createDynamicWorkflowEntrypoint,
DynamicWorkflowBinding,
wrapWorkflowBinding,
type WorkflowRunner,
} from "@cloudflare/dynamic-workflows";
export { DynamicWorkflowBinding };
interface Env {
WORKFLOWS: Workflow;
LOADER: WorkerLoader;
}
function loadTenant(env: Env, tenantId: string) {
return env.LOADER.get(tenantId, async () => ({
compatibilityDate: "2026-01-01",
mainModule: "index.js",
modules: {
"index.js": await fetchTenantCode(tenantId),
},
env: {
WORKFLOWS: wrapWorkflowBinding({ tenantId }),
},
}));
}
export const DynamicWorkflow = createDynamicWorkflowEntrypoint<Env>(
async ({ env, metadata }) => {
const stub = loadTenant(env, metadata.tenantId as string);
return stub.getEntrypoint("TenantWorkflow") as unknown as WorkflowRunner;
},
);
export default {
fetch(request: Request, env: Env) {
const tenantId = request.headers.get("x-tenant-id")!;
return loadTenant(env, tenantId).getEntrypoint().fetch(request);
},
};
詳細情報
詳細なウォークスルーについては、Dynamic Workflows ガイドを参照してください。