「何度押しても大丈夫?」HTTPの冪等性(べきとうせい)を郵便配達で理解しよう
こんにちは!ネットワークの世界へようこそ。
インフラエンジニアとして現場を歩いていると、「なぜかデータが二重に登録されてしまった」「ブラウザの更新ボタンを連打したら注文が重複した」という相談をよく受けます。
これ、実はHTTPプロトコルの「冪等性(べきとうせい)」という概念を知るだけで、劇的に防げるトラブルなんです。
今日は、小難しい仕様書の言葉を一度置いておいて、私たちの身近な「郵便配達」に例えながら、この大事なルールを紐解いていきましょう!
—
1. 「冪等性」って、要するに何?
いきなり漢字で「冪等(べきとう)」なんて書かれると身構えてしまいますよね。でも、意味はとてもシンプルです。
「何度同じ操作を繰り返しても、結果が同じであること」
これだけです。
もしあなたが「100円を振り込む」という操作を5回繰り返したら、500円減ってしまいますよね。これは「何度やっても同じ結果(100円の減少)」にはならないので、冪等ではありません。
一方で、「この書類を破棄してください」という指示ならどうでしょう?
1回破棄しても、2回目に「破棄してください」と言われても、すでに書類はないので状態は変わりません。これが「冪等」です。
—
2. HTTPメソッドと「郵便」の役割分担
Webの世界では、ブラウザ(あなた)とサーバー(郵便局)の間で、メソッドという「伝言カード」を使ってやり取りをします。主なメソッドを見ていきましょう。
GET(情報を読み取る:結果は変わらない)
図書館で本を借りるのではなく「閲覧する」イメージです。何度ページをめくっても、本の内容は変わりませんよね。だからGETは「冪等」です。
PUT(情報を上書きする:結果は変わらない)
「この住所の表札を『山田』に変えてください」という指示です。1回やっても、10回やっても、最終的に表札が「山田」であることに変わりはありません。だからPUTも「冪等」です。
DELETE(情報を消去する:結果は変わらない)
「この手紙を燃やしてください」という指示です。1回燃やしてしまえば、2回目以降は「もう燃えていて何もない」という状態で止まります。だからDELETEも「冪等」です。
POST(情報を新しく作る:結果は変わる!)
ここが最大の注意点です!POSTは「冪等ではありません」。
「この注文書を新しい注文として受理してください」という指示は、5回送れば5回分、新しい注文が作成されてしまいます。これが「冪等ではない」ということの正体です。
—
3. 実装上の注意:なぜ「二重送信」は起きるのか?
インフラの現場でよくあるのが、ネットワークの遅延によるリトライ(再送)です。
1. あなたが注文ボタンを押す(POST)
2. サーバーまで信号が届くが、少し重くて返事が遅れている
3. あなたは「あれ?送れてないかな?」と思って、もう一度ボタンを押す
4. サーバーには2つの注文が届いてしまい、二重決済が発生する
これを防ぐための、プロの知恵が「トークン(目印)」の利用です。
サーバー側の実装例(擬似コード)
二重送信を防ぐために、サーバー側で「この注文は一度受け取ったよ!」という記録を残すのが定石です。
// サーバー側の処理イメージ
async function handleOrder(request) {
const transactionId = request.headers[‘X-Transaction-ID’]; // クライアントが発行したユニークなID
// このIDが既にデータベースにあるか確認
const isAlreadyProcessed = await database.check(transactionId);
if (isAlreadyProcessed) {
// すでに処理済みなら、新しい注文は作らずに「成功」の結果だけを返す
return { status: 200, message: “既に処理済みです” };
}
// 初めての注文なら、データベースに保存する
await database.saveOrder(request.body, transactionId);
return { status: 201, message: “注文を受け付けました” };
}
このように、「クライアント側で一意なIDを発行し、サーバー側でそれをチェックする」という仕組みを組み込むことで、POSTのような非冪等な操作でも、安全にリトライできるようになります。
—
最後に:一歩ずつ理解を深めよう
「冪等性」という言葉、最初は難しく聞こえたかもしれませんが、こうして見ると「何度やっても結果が壊れないように設計する」という、エンジニアとしての誠実な気配りそのものだと思いませんか?
- GET/PUT/DELETE は「何度やっても安心」
- POST は「慎重に、一度きりになるよう工夫する」
この基本を頭の片隅に置いておくだけで、あなたの作るアプリケーションやインフラ設計は、驚くほど信頼性の高いものになりますよ。
今日の学びが、あなたのエンジニアライフの一助になれば幸いです。何か詰まったら、またいつでもここに戻ってきてくださいね!
コメント