Skip to content

Durable Executionとワークフローエンジン

この記事は英語版から翻訳されました。最新版は英語版をご覧ください。

Durable executionは、通常のプログラムのようにワークフローコードを書きながら、クラッシュ後に復元できるだけの履歴を記録する方式です。エンジンは決定、タイマー、Activity完了、signalを永続化し、再起動時に履歴をreplayして状態を再構築します。

中核アイデア

ワークフロー関数は決定的な状態機械です。Activityが非決定的な副作用を実行します。

replayが耐久性を作ります。同時に、決定性が必須になります。

Workflow Code と Activity Code

コード種別network callwall clockretry owner決定性
Workflow code不可engine API経由のみEngine厳格
Activity codeActivity policy冪等

Workflow codeは決定し、Activity codeは実行します。

Event History

代表的なイベント:

  • WorkflowStarted
  • ActivityScheduled
  • ActivityStarted
  • ActivityCompleted
  • ActivityFailed
  • TimerStarted
  • TimerFired
  • SignalReceived
  • ChildWorkflowStarted
  • WorkflowCompleted

履歴は1インスタンスの追記ログです。決定的replay、監査、復旧を可能にします。

Durable Timer

プロセス内sleepは耐久的ではありません。durable timerは永続イベントです。

text
TimerStarted(id=payment-settlement, fire_at=2026-06-16T00:00:00Z)
...
TimerFired(id=payment-settlement)

待機中にワーカーが生きている必要はありません。

バージョニング

長時間ワークフローはデプロイをまたぎます。新コードで古い履歴をreplayすると分岐する可能性があります。

安全策:

  • workflow historyにversion markerを残す
  • continue-as-newで長い履歴を新コードに移す
  • 古いrunがdrainするまで旧workerを残す
  • map/setの非決定的iterationを避ける
  • workflow typeをversion別にrouteする

副作用とSaga

外部副作用はActivityに閉じ込め、冪等キーを使います。

text
idempotency_key = workflow_id + ":" + activity_id + ":" + logical_operation

Durable workflow engineはSagaの自然な実装です。

成功済みのforward stepが履歴に残るため、必要な補償だけを実行できます。

スケーリング

圧力設計対応
大量のwaiting workflowtimerを効率保存しworkerを常駐させない
巨大履歴snapshotまたはcontinue-as-new
hot workflowsignalとchild fan-outを制限
activity throughputactivity class別task queue
worker deploydrainとversioning
multi-tenant loadnamespace quota

障害モード

障害原因対策
非決定的replayrandom/time/networkをworkflow codeで読む決定的API、replay test
Activity結果喪失副作用後にworker crash冪等キーとactivity retry
履歴肥大化長いloopやchatty signalcontinue-as-new
version break新コードが旧履歴をreplayできないversion marker
stuck workflowsignal待ちが永遠に来ないtimer、escalation、repair

関連パターン

MITライセンスの下で公開。Babushkaiコミュニティが構築。