文字起こし、要約、品質検査、承認、公開のように複数段階が依存するAI処理は、単一のWorkerやQueue consumerへ詰め込むと、途中失敗時にどこから再開するかが曖昧になります。Cloudflare Workflowsは、各stepの結果を永続化し、失敗したstepから再試行するdurable executionの仕組みです。
QueuesとWorkflowsを分ける
CloudflareのWorkers Best Practicesは、Queuesをproducerとconsumerの分離、buffering、batching、単一stepのbackground jobに、Workflowsを依存関係のある複数stepの処理に使うと整理しています。
例えば、音声アップロード後に「文字起こし→匿名化→要約→人の承認→公開」を行うならWorkflowが向きます。一方、監査イベントをまとめて書き込む処理はQueueが向きます。QueueからWorkflowを起動する構成も可能ですが、同じ責務を二重に持たせません。
stepは副作用の境界で分ける
Cloudflare Workflowsのstep.do()は、成功した結果を永続化し、後続stepが失敗しても完了済みstepを再実行しません。分割の基準は「この処理だけ再実行しても安全か」です。
- R2から入力を取得する
- AI providerへ送信する
- 結果を検証する
- D1へ確定保存する
- 外部通知を送る
大きな一stepにすると、通知だけ失敗してもAI呼び出しから再実行します。逆に細かくしすぎるとstep数、保存状態、観測が増えます。費用や副作用が変わる境界で切ります。
再試行できない失敗を区別する
公式ドキュメントでは、step.doの既定設定はretry limit 5、10秒delay、exponential backoff、timeout 10分です。429や一時的なnetwork errorは再試行候補ですが、入力形式不正、権限不足、存在しないmodelは同じ試行で直りません。
error classを分類し、永久エラーはNonRetryableError等で停止します。再試行回数を増やす前に、外部APIのidempotency keyと副作用の重複防止を確認します。
永続化する値を小さくする
step resultは次のstepで再利用できますが、プロンプト全文、音声、巨大なPDFをそのまま状態へ持たせない設計が安全です。公式ルールでは、非streamのstep return valueには1MiB上限があります。大きなartifactはR2へ置き、Workflowにはobject key、hash、version、最小metadataだけを返します。
機密データは、保存目的、閲覧権限、保持期限、削除方法を決めます。Workflowの観測性のために本文ログを無期限保存しません。
人の承認をdurableに待つ
step.waitForEvent()はWorkflowを一時停止し、外部eventを受け取って再開できます。公式docsでは既定timeoutは24時間、1秒から365日まで設定可能です。承認待ちをpolling loopで作る必要はありません。
承認eventには、workflow instance ID、対象artifactのhash、承認者、判断、時刻を含めます。承認後にartifactが差し替わらないよう、承認対象versionを固定します。timeout時の既定挙動はfail-closeにし、「応答がなければ公開」を避けます。
観測する指標
instance成功率だけでなく、step別の失敗率、retry回数、処理時間、承認待ち時間、timeout、AI呼び出し費用を見ます。model変更、prompt変更、workflow versionを同じ実験で重ねないことも重要です。
本番前には、各stepの失敗、timeout、重複event、古い承認、R2 object欠損をテストします。completed stepが再実行されないことと、外部副作用が冪等であることを別々に確認します。
AI処理の長時間実行を設計したい方へ
TechWorkerでは、Cloudflare Workers、Queues、Workflows、R2、D1を使い、受付からAI処理、承認、監査、削除までを設計します。単一jobの非同期化はCloudflare QueuesでAIジョブを非同期化する、運用上の設定罠はWorkers本番運用で踏んだ罠5つも参照してください。
一次情報と確認範囲
確認日:2026年9月1日。製品仕様・制度は更新されるため、導入時はリンク先の最新版を再確認してください。数値や研究結果は対象・条件を超えて一般化せず、反証可能性と限界を本文に併記しています。
