配送、冪等性、CDC

対象本文

第8章のdelivery semantics、retry、idempotency key、Transactional Outbox、Change Data Capture (CDC)を補います。workflow engine内部の履歴はA-DURABLE-01へ分けます。

収集方法

2026年7月10日にStripe Idempotent Requests、AWS Step Functions、DynamoDB Streams、Google Spanner change streams、Google Datastreamの公式資料を確認しました。異なる製品の「once」を同じ保証へ換算せず、重複が生じる境界と保持期間の正本を記録しています。

現在の答え

境界基盤ができること利用者に残ること
message delivery少なくとも一度、最大一度、可視性timeout、DLQ等の配送保証handlerの冪等性、ordering key、poison message判断
API requestidempotency keyと保存済みresponseの再利用keyの生成単位、payload不一致、保持期限後の再送、downstream side effect
workflow step完了stepの記録、retry、wait、callbackexternal APIのkey、作用記録、補償、timeout境界
database change streamcommit済み変更のlog/stream化、offsetまたはtimestampからの読出しretention内での復旧、consumer重複排除、schema change、再構築

StripeはclientがIdempotency-Keyを送ると、同じkeyの最初のrequest結果を保存し、retryへ同じ結果を返す仕様を説明します。keyの保持は永続ではなく、一定期間後に削除され得ます。したがってkeyは「永遠に一度きり」ではなく、定めた再試行窓の中で同じ作用を識別する名前です。

keyはruntimeの都合で毎回randomに作るのではなく、同じ論理作用なら再生成できる形にします。例はrun_id + step_id + target + operation_versionです。request bodyのdigestと一緒に保存し、同じkeyで異なる操作を受けたら拒否します。

CDCは、database commitとevent publishの二重書込みを避ける有力な実装です。ただし「基盤がOutboxを運用する」場合でも、change streamは複数回読まれ得ます。consumerはtransaction ID、record sequence、business key等で重複を除き、retentionを超えた停止時にはsnapshotから再構築する手順を持ちます。

現在値の例として、DynamoDB Streamsは短い固定retentionを持ち、Spanner change streamsは設定可能なretention範囲を持ちます。この差は「どちらが高機能か」ではなく、consumer停止時の復旧窓、storage cost、replay手順をどこへ置くかの差です。値は一次資料を正本にします。

一次資料

記入用の雛形——リトライ予算(空欄版)

書籍第8章8.7のリトライ予算を自分の操作で書き出すための空欄版です。操作ごとに複製して使います。

操作:
リトライ責任者:
リトライする失敗 / しない失敗:
一回あたりのタイムアウト:
最大試行回数・総経過時間:
バックオフ・ジッタ:
同時実行の上限:
冪等性キーと保持期間:
再試行時の認可・承認確認:
予算枯渇後(DLQ/補償/人手/失敗応答):
残す結果参照:

既知の未知

変更履歴