二度押しに耐える
再試行は二重予約を作る
前回、失敗したら試し直す仕組みを書きました。
ここに落とし穴があります。返事が来なかっただけで、相手は成功していたかもしれません。
書き込みは終わっていて、返事が途中で消えただけ。そこへ試し直すと、予約が2件できます。
分かりません。送信中に消えたのか、返信中に消えたのかは、こちら側からは区別できません。
利用者が二度押ししたときも同じです。どちらの場合でも、同じ要求が2回届きます。
同じ鍵なら同じ答えを返す
直し方は、要求に鍵を1つ付けてもらうことです。
同じ鍵で2回目が来たら、新しく作らず1回目の結果をそのまま返します。
Python
# 鍵 k1 で予約 → res-1 を作る
# 鍵 k1 でもう一度 → 作らずに res-1 を返す利用者から見ると、どちらも成功に見えます。予約は1件だけです。
付け忘れたら守れません。そこは受ける側が必須にします。
鍵の無い予約要求は受け付けない、と決めれば付け忘れは起きません。安全の仕組みを相手の善意に任せると、いつか破れます。
演習
鍵付きの予約要求を順に処理し、同じ鍵の2回目では新しく作らない形にします。
要件
- はじめて見る鍵なら新しい予約を作る。予約IDは "res-" のあとに作った順の番号を付ける。1件目は res-1
- すでに見た鍵なら新しく作らず、その鍵で作った予約IDをそのまま results に入れる
- created は作った数、duplicated は作らずに返した数
ヒント
編集 ゆめさく編集部