# Temporal ## 概要 Temporal は [[Durable Execution]] を実装するワークフローエンジンの代表例。ワークフロー内の各処理ステップを Temporal は「アクティビティ(activity)」と呼ぶ(他のフレームワークは「durable function」と呼ぶこともあるが概念は同じ)。決済処理(不正検知 → クレジットカード引き落とし → 銀行口座入金)のような、複数サービス呼び出しにまたがる一連の処理を、失敗時の再実行を含めて信頼性高く実行するために使う。ワークフロー定義は Python 等の汎用プログラミング言語で書け、`@workflow.defn` と `@workflow.run` デコレータでワークフロー本体を、`workflow.execute_activity` で個々のアクティビティ呼び出しをタイムアウト付きで記述する。(Source: [[@2026__OReilly__Designing Data-Intensive Applications 2E - Chapter 5 Encoding and Evolution]] "Durable Execution and Workflows") ## 実行モデルの制約 Temporal は全ての RPC 呼び出しと状態変化を write-ahead log 的な耐久ストレージに記録し、失敗したタスクを再実行する際にはこのログを再生することで、既に成功した呼び出しを実際には再実行せず記録済みの結果を返す(exactly-once 的セマンティクス)。これは2つの強い制約を伴う。第一に、外部サービス(決済ゲートウェイ等)自体はべき等な API を提供する必要があり、開発者は一意な ID を使って重複実行を防がなければならない。第二に、再実行はログの記録順と同じ順序で同じ RPC 呼び出しをすることを前提とするため、稼働中のワークフローのコードを書き換える(呼び出し順序を変える等)と未定義動作を招きうる。乱数生成やシステム時刻の参照のような非決定的なコードも同様に問題になり、Temporal は決定的な代替実装や静的解析ツール(Workflow Check)を提供する。安全な変更方法は、既存ワークフローのコードをその場で書き換えず、新バージョンを別デプロイとして追加し、実行中のワークフローインスタンスは旧バージョンのまま完走させることである。(Source: [[@2026__OReilly__Designing Data-Intensive Applications 2E - Chapter 5 Encoding and Evolution]] "Durable Execution and Workflows") ## 関連 - ソース: [[@2026__OReilly__Designing Data-Intensive Applications 2E - Chapter 5 Encoding and Evolution]] - 概念: [[Durable Execution]] / [[べき等性]] ## 出典 - [[@2026__OReilly__Designing Data-Intensive Applications 2E - Chapter 5 Encoding and Evolution]]("Durable Execution and Workflows")