よろずやIT
プログラミング

冪等性(べきとうせい)とは?二重決済を防ぐAPI設計の考え方

執筆・監修:よろずやIT編集部|編集方針を見る

結論:まずここだけ読めばOK

詳しい手順・原因は、この下で解説しています。

プログラミングのイラスト

冪等性とは何か

冪等性(idempotency、べきとうせい)とは、同じ処理を1回実行した場合と、複数回繰り返し実行した場合とで、最終的な結果(状態)が変わらないという性質のことです。プログラミング、特にAPI設計の文脈でよく使われる考え方です。

「エレベーターのボタン」に例えると

身近な例で考えると、エレベーターの呼び出しボタンが分かりやすいです。ボタンを1回押しても、慌てて3回連打しても、結果として「エレベーターが来る」という状態は変わりません。3回押したからといって、エレベーターが3台来るわけではないはずです。冪等性のあるシステムは、これと同じように「何度実行されても、結果が1回分と同じ」になるよう設計されています。

なぜ重要なのか:ネットワークの「不確実性」への備え

インターネット越しの通信では、リクエストを送った後に通信が不安定になり、処理が成功したのか失敗したのか、送信側からは正確に判断できない場面があります。この時、「念のため、もう一度送信する」という再送処理は、実務でよく行われる対応です。

しかし、もし決済処理のようなシステムが冪等性を考慮せずに作られていた場合、この再送によって「同じ決済が2回実行されてしまう」という深刻な問題が起こり得ます。

図で見る、再送信時の挙動の違い

冪等性の有無によって、再送信した時の結果がどう変わるのか、図で確認してみましょう。

冪等性の有無による決済APIの違いを示す図解

「冪等キー」という解決策

この問題に対応するため、多くのAPIでは「冪等キー(Idempotency Key)」という仕組みが使われています。リクエストを送る側が、そのリクエスト固有の識別子(キー)を発行して一緒に送信し、サーバー側は「このキーはすでに処理済みかどうか」を記録しておきます。同じキーのリクエストが再び届いた場合、サーバーは新しく処理を行わず、前回と同じ結果をそのまま返すことで、意図しない二重処理を防ぎます。

冪等キー付きで送信し、再送しても、前回の結果を返して二重に処理しない流れの図解

HTTPメソッドと冪等性の関係

Web開発の基礎となるHTTPの仕様でも、各メソッドに冪等性の有無が定義されています。MDN Web Docsの解説によれば、GETやPUT、DELETEといったメソッドは冪等であるとされる一方、POSTメソッドは冪等ではないメソッドに分類されています。これは、POSTが一般的に「新しいデータを作成する」目的で使われることが多く、同じリクエストを2回送ると、2件のデータが作られてしまう可能性があるためです。だからこそ、POSTで実装される決済や注文確定などの処理では、開発者が意識的に冪等性を持たせる工夫が必要になります。

実際の開発現場でよくあるつまずき

3つ目のように、システム内部の設計だけでなく、利用者側の操作(連打)によって意図せず同じリクエストが複数回送られてしまうケースも、現場では頻繁に起こります。

GETリクエストが冪等でも、キャッシュには注意

余談ですが、GETリクエストが冪等であることと、その結果が常に同じ内容を返すことは、厳密には別の話です。サーバー側のデータが更新されていれば、同じGETリクエストでも返ってくる中身は変わります。冪等性が保証しているのは、あくまで「サーバー側の状態が、リクエストの回数によって余計に変化しない」という点であることを理解しておくと、混同を防げます。

設計する時の、確認のチェックリスト

冪等性は、設計の段階で、確認しておくと、後の障害を防げます。次の項目に、答えられるか確認してください。

  1. その操作は、繰り返しても、結果が変わらないか(参照、上書きは冪等になりやすい)
  2. 繰り返すと結果が変わる操作(決済、登録、送信)では、二重処理を防ぐ仕組みがあるか
  3. 再試行する場合、その再試行は、冪等な操作にだけ行っているか
  4. クライアントが、同じ操作の再送を、見分けられる印(冪等キーや、一意な番号)を持っているか
  5. タイムアウトした時に、処理が終わっていたかどうかを、確認する手段があるか

特に、決済や注文のように、二重処理の影響が大きい操作では、冪等キーを使った設計が、有効です。実装の詳細は、冪等キー(Idempotency-Key)とは?二重決済・二重登録を防ぐAPI設計と実装のポイントで解説しています。再試行の設計は、APIのタイムアウトとリトライの決め方をご覧ください。

要点を整理すると

冪等性は、普段の利用者からは見えない、裏側の設計に関わる考え方です。しかし、決済や予約などの重要な処理ほど、「同じリクエストが複数回届いても、結果が変わらない」ように設計されているかどうかが、実際のトラブルの有無を大きく左右します。

この記事の情報源

※ 仕様の詳細は更新されることがあるため、最新の内容は上記の公式ページもあわせてご確認ください。

PRWeb API設計実践入門──API仕様ファーストによるテスト駆動開発 [ 柴田 芳樹 ]

Web API設計実践入門──API仕様ファーストによるテスト駆動開発 [ 柴田 芳樹 ]

¥2,860

楽天で見る
SHAREXLINEはてブ

よくある質問

Q.冪等性は、どんなAPIにも必要な考え方ですか?

A.特に重要なのは、決済や在庫の増減、予約の確定など、『2回実行されると実害が出る』処理です。単なる情報の取得(検索など)であれば、そもそも実行回数によって結果が変わりにくいため、意識する優先度は下がります。

Q.冪等キーは誰が発行するのですか?

A.多くの場合、リクエストを送る側(クライアント)が、リクエストごとに一意なキーを生成して送信します。サーバー側は、そのキーをすでに処理済みかどうかを記録しておき、同じキーが再度届いた場合は、新しく処理をせず、前回と同じ結果を返す仕組みになっています。

Q.GETやDELETEは冪等だと聞きましたが、DELETEを2回実行したら何か問題がありますか?

A.同じ対象を2回削除しようとしても、サーバー側の最終的な状態(そのデータが存在しない)は変わらないため、冪等だとされています。ただし、1回目は成功のレスポンス、2回目は『すでに存在しません』というレスポンスになるなど、返ってくる応答の内容自体は異なる場合があります。MDNの解説でも、冪等性はサーバー側の状態についての性質であり、返却される応答の中身までは保証しないと説明されています。

関連記事

プログラミング困りごと解決

API連携が「両方正常なのに繋がらない」時の確認5項目と切り分けの順番

どちらのシステムも正常に動いているのに、連携だけがうまくいかない。API連携で一番苦労するこのケースの原因は、認証情報・データ形式・必須項目・バージョン・通信の5つに絞れることが多いです。確認の順番と、HTTPステータスの読み方を整理します。

プログラミング用語解説

Webhookとは|APIとの違いと、通知が届く仕組み・安全に受け取る注意点

Webhookは、何かが起きた時に、サービス側から、指定したURLへ自動で通知を送る仕組みです。APIやポーリングとの違い、通知が届く流れ、受け取る側の注意点(署名の検証・再送・冪等性)をまとめます。

プログラミング困りごと解決

APIをループで呼ぶ時の3つの約束|間隔・上限・再試行でアクセス制限を防ぐ

APIをループ処理で何度も呼ぶと、短時間にリクエストが集中して、相手のサービスからアクセス制限を受けることがあります。待ち時間を入れる、件数の上限を決める、失敗時に間隔をあけて再試行する、の3つの約束と、サンプルコードを紹介します。

プログラミング用語解説

SQLインジェクション対策|プレースホルダ・エスケープの違いと限界

SQLインジェクションを防ぐ根本的な対策は、プレースホルダ(パラメータ化クエリ)です。エスケープや入力チェックとの違い、サニタイズの効果と限界、コード例、多層で守る考え方を解説します。

最新のIT関連書籍 トップ10

PR / 楽天市場の売れ筋ランキングを定期的に取得しています。価格は変動する場合があるため、購入前に各ストアでご確認ください。