【テンポラル】
Temporal とは?
最終更新:
💡 実行履歴を使って、障害後も処理を続ける
実行履歴を保存し、障害後もワークフローの状態を再構成して処理を続けるためのプラットフォーム。WorkflowとActivityをコードで定義する。再試行やタイムアウトを扱えるが、業務処理の成功を常に保証するものではない。
📌 このページのポイント
- Workflowの実行履歴から、状態を再構成して続ける
- Workflowは再実行時も同じ判断になるように書く
- 外部処理はActivityへ分け、再試行による重複に備える
- 失敗時の扱いや補償処理は、業務に合わせて設計する
落ちても必ず最後まで成功するの?
障害後に状態を復元して続ける仕組みはあるけれど、業務としての成功は保証しないよ。例えば支払いの拒否や、再試行を尽くしたエラーは、失敗として扱うことがある。バッチ処理でも再開機能を持つものはあるので、普通のバッチは全部最初からやり直し、とも言えないね
どうやって途中の状態を戻すの?
Temporal Serviceが実行履歴を保存し、WorkerがWorkflowのコードをその履歴と照らして再実行するよ。記録済みのActivityの結果は履歴から使い、続きの判断へ進む。メモリの全てをそのまま保存して、プログラムの好きな行から戻す仕組みとは違うんだ
普通のコードをそのまま書けばいい?
Workflowは履歴に対して同じ判断を再現できるように書く必要があるよ。外部APIやDBへの操作はActivityへ分ける。コード変更で履歴と矛盾する場合もあるので、再開の仕組みがあるからといって、任意のコードを無条件に復旧できるわけではないね
再試行しても二重に決済されない?
Activityは複数回実行される場合があるよ。決済が済んでも、その結果を報告する前にWorkerが落ちたら、再度呼ばれる可能性がある。繰り返しても重複した結果にならないよう、外部サービスの重複防止キーなどを使う設計が必要なんだ
失敗したら元に戻してくれる?
補償処理をWorkflowに組み込むことはできるけれど、何をどう取り消すかは開発者が定義するよ。公式のSaga例でも、エラーを受けて補償用Activityを呼ぶコードがある。登録するだけで全サービスの変更を自動で完全に巻き戻せるわけではないんだ
まとめ:ざっくりこれだけ覚えればOK!
「Temporal」って出てきたら「実行履歴を使い、障害後もワークフローを続けるための基盤」と思えばだいたいOK!
📖 おまけ:英語の意味
「Temporal」 = 時間に関する
💬 temporalは時間に関するという意味の英語だよ。製品名の命名理由を断定するものではなく、ここではワークフローを実行するプラットフォームを指すんだ