【テンポラル】

Temporal とは?

最終更新:
💡 実行履歴を使って、障害後も処理を続ける

実行履歴を保存し、障害後もワークフローの状態を再構成して処理を続けるためのプラットフォーム。WorkflowとActivityをコードで定義する。再試行やタイムアウトを扱えるが、業務処理の成功を常に保証するものではない。

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

参考資料

← 用語集にもどる