冪等性

冪等性とは

冪等性(べきとうせい・idempotency)は、同じ操作を1回行っても複数回行っても、結果が同じになる性質のことです。

ネットワークは必ず失敗します。「リクエストを送ったが応答が返ってこない」とき、処理が実行されたのか分からないままリトライ(再送)するしかありません。このとき操作が冪等なら、たとえ実は1回目が成功していても、2回目で二重処理にならず安全です。

冪等な操作   : 「ステータスを発送済みにする」→ 何度やっても発送済み
冪等でない操作: 「残高から1000円引く」→ 2回実行すると2000円引かれる!

HTTPメソッドと冪等性

[[HTTP]] のメソッドは、仕様上の冪等性が定義されています。

メソッド冪等?理由
GET取得するだけで状態を変えない
PUT「この内容に置き換える」ため何度やっても同じ状態になる
DELETE削除済みのものを再度削除しても結果は同じ
POST×「新規作成」は実行のたびに増える

[[REST API]] の設計でメソッドを選ぶとき、この性質が判断材料になります。問題は冪等でない POST — 決済や注文の作成でリトライすると二重決済・二重注文が起きてしまいます。

冪等キーによる対策

POST を安全にリトライできるようにする定番の仕組みが冪等キー(Idempotency Key)です。

  1. クライアントがリクエストごとに一意なキーを生成し、ヘッダーに付けて送る
  2. サーバーはキーと処理結果を保存しておく
  3. 同じキーのリクエストが再度来たら、処理を実行せず保存済みの結果を返す

決済サービスの Stripe が採用したことで広く知られるようになったパターンで、リトライしても課金は1回しか発生しません。

初学者向けポイント

  • [[Webhook]] の受信処理は再送が前提です — イベントIDで処理済みかを確認してから処理する、が基本形です
  • [[メッセージキュー]] の多くは「少なくとも1回配信」(同じメッセージが2回届き得る)なので、受信側の冪等性が必須です
  • 「この処理、2回動いたらどうなる?」と自問する癖をつけましょう。分散システム設計の基本の問いです

関連技術とのつながり

  • [[REST API]] — メソッド選択と冪等キー設計の実践の場
  • [[HTTP]] — GET / PUT / DELETE は冪等、POST は非冪等という仕様上の性質
  • [[Webhook]] — 再送される通知を安全に処理するために冪等性が必要
  • [[メッセージキュー]] — 重複配信があり得るため受信側の冪等化が前提
  • [[エラーハンドリングとリトライ設計]] — 冪等性を前提に安全な再試行を組む方法
  • [[分散トランザクションとSaga]] — 冪等性が実際に効く代表的な分散設計
Q: 冪等性の説明として正しいのはどれ?
- [x] 同じ操作を何度実行しても結果が変わらない性質
- [ ] 処理が必ず1秒以内に完了する性質
- [ ] データが暗号化されて保存される性質
解説: 冪等性は実行回数によらず結果が同じになる性質で、安全なリトライの土台になります。

Q: HTTPメソッドのうち仕様上冪等でないのはどれ?
- [ ] PUT
- [ ] DELETE
- [x] POST
解説: POST は新規作成のため実行のたびに結果が増えます。GET・PUT・DELETE は仕様上冪等です。

Q: 冪等キーを受け取ったサーバーが、同じキーの再送に対して行うことはどれ?
- [ ] 毎回新しく処理を実行して最新の結果を返す
- [x] 処理を実行せず、保存しておいた1回目の結果を返す
- [ ] エラーとして接続を強制切断する
解説: 同じキーなら保存済みの結果を返すことで、リトライしても処理は1回しか実行されません。