Digital Appendix
『AIエージェントが見つけたサーバーレス』のデジタル付録
配送、冪等性、CDC
配送、冪等性、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 request | idempotency keyと保存済みresponseの再利用 | keyの生成単位、payload不一致、保持期限後の再送、downstream side effect |
| workflow step | 完了stepの記録、retry、wait、callback | external APIのkey、作用記録、補償、timeout境界 |
| database change stream | commit済み変更の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手順をどこへ置くかの差です。値は一次資料を正本にします。
一次資料
- Stripe Idempotent Requests: https://docs.stripe.com/api/idempotent_requests
- AWS Step Functions workflow types: https://docs.aws.amazon.com/step-functions/latest/dg/choosing-workflow-type.html
- DynamoDB Streams: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.html
- Spanner change streams: https://docs.cloud.google.com/spanner/docs/change-streams
- Google Datastream behavior: https://docs.cloud.google.com/datastream/docs/behavior-overview
- Transactional Outbox pattern: https://microservices.io/patterns/data/transactional-outbox.html
記入用の雛形——リトライ予算(空欄版)
書籍第8章8.7のリトライ予算を自分の操作で書き出すための空欄版です。操作ごとに複製して使います。
操作:
リトライ責任者:
リトライする失敗 / しない失敗:
一回あたりのタイムアウト:
最大試行回数・総経過時間:
バックオフ・ジッタ:
同時実行の上限:
冪等性キーと保持期間:
再試行時の認可・承認確認:
予算枯渇後(DLQ/補償/人手/失敗応答):
残す結果参照:
既知の未知
- idempotency keyの保持、request size、delivery retry、stream retention、replay APIは変更されます。
- Product documentationの「exactly once」は、外部API、email、payment、human actionまで一括で保証しません。
- CDCのschema change、transaction boundary、before/after image、orderingはengineと構成で異なります。
- Stripeは代表例であり、IETF等の汎用HTTP標準として全APIに同じ保証があるわけではありません。
変更履歴
- 0.10.0 (2026-07-28): 書籍のJIS B5・本文112ページ対応にともない、第8章8.7の記入用雛形(空欄版)を本文から移設。
- 0.9.0 (2026-07-10): API冪等性、workflow retry、CDC retentionを作用境界ごとに分けた初版ドラフトを作成。