概要
ワークフローとアクティビティは永続境界の両側にあり、異なる制約に従います。ワークフローコードはリプレイされ、アクティビティコードはリトライされます。
冪等性と決定性では、この二つを具体例で比較し、一方を満たしても他方を満たすとは限らないことを説明しています。
-
ワークフローコードには決定性が必要です。 別の Worker、再起動後、デプロイ後、長時間の実行中など、再開時にはエンジンが履歴をリプレイして状態を再構築します。リプレイはワークフロー本体を再び呼び出します。アクティビティを再実行することはありません。同じ履歴から、同じ順序の判断を生成する必要があります。実際の時計、変化するキャッシュ、乱数、ネットワークなどを本体から直接読み取らず、
Workflow::now()、sideEffect(...)、アクティビティなどを使って永続境界を越えてください。 -
アクティビティコードには冪等性が必要です。 アクティビティの試行は少なくとも一回実行されます。リトライ、リース期限切れ、再配信により、同じ論理的な処理を複数回観測することがあります。これは正常な契約です。永続状態には各試行の終端結果を最大一つ記録しますが、エンジンが有効な報告を受け取るまでに、アクティビティ本体が複数回開始されることがあります。外部の副作用を重複させられない場合は、冪等キー、決定的な対象リソース、自然に冪等な操作を使ってください。
-
イベントソーシングは履歴を保存します。 アクティビティ完了、タイマー発火、シグナル受信、副作用の記録など、各永続ステップは型付き履歴イベントとして保存されます。リプレイは記録済みの結果を本体に渡し、アクティビティ、タイマー、シグナルを再びディスパッチしません。伝送層が作業を複数回配信しても、同じ永続識別子の状態イベントは履歴層で一回だけ記録されます。
決定性と冪等性を組み合わせることで、デプロイ、Worker の再起動、分散環境のリトライをまたぐワークフローを、進行状況を失わずに再開できます。アプリが安全に繰り返せるよう設計した外部副作用も重複しません。
実行保証と冪等性は、リプレイ、再配信、リース期限切れ、識別子ごとに一回だけ記録する永続履歴の公開 v2 契約を説明します。ワークフローの制約では決定的なコードのルールを、アクティビティの制約では安全な少なくとも一回の実行を説明します。