sano11o1

Implementing Stripe-like Idempotency Keys in Postgres を読んだ

公開日:

https://brandur.org/idempotency-keys を読んだのでその感想。

Idempotency KeysとはAPIのリクエストを冪等に処理するための仕組み。
概念だけ知りたい人は以下の記事がおすすめです。


https://brandur.org/idempotency-keys ではIdempotency Keysをどのように実装するか具体的なコード、テーブル構成とともに解説している。

以下メモ

  • WebAPIはいつどんな理由で失敗するか分からないため、決済のようなAPIは副作用が一度しか起こらないことを保証するべき。
  • Idempotency Keysを実装することで安全にリトライできるAPIを実装する。
  • APIの処理を複数のRDBMSのトランザクション(記事の中ではAtomic phaseと表現されている)に分割する。
  • Idempotency Keysの状態を各トランザクションで変更することで、リトライする際にどこまで進んでいるかを判別し処理を続行できる。
  • 実装するAPI内で叩くAPI(記事の中ではStripe API)がIdempotencyなAPIでない場合は注意が必要
    • 1. クライアントがIdempotency Key「A」を使ってリクエスト
    • 2. サーバーは外部のAPIにリクエストし、外部サーバーは曖昧なエラーをサーバーに返す
    • 3. サーバーはクライアントにエラーを返す
    • 4. クライアントがリトライする
    • 5. サーバーは外部のAPIにリクエストし成功する
  • もし上記の2でレスポンス上は失敗していても内部的に処理が成功していた場合、2と5で2回処理が実行される。そのため2のエラーが返ってきた時点で、Idempotency Key「A」を使ったリクエストは今後受け付けないようにするべき


今までなんとなく理解していたことがまとまった。冪等性が求められるAPI(決済など)を実装する時は参考にしたい。