時間切れと再試行
待ち続けない
外の相手に問い合わせるとき、返事が来ないことがあります。
返事を待ち続けると、こちらの処理も止まります。1本の流れが止まり、次の要求も待たされ、やがて全体が詰まります。
だから先に、何秒で諦めるかを決めます。これが時間切れです。
返ってくるかもしれません。ただし待っている間、こちらの資源は塞がったままです。
1件のために止まるくらいなら、諦めて空けたほうが、ほかの99件は通ります。諦める時間を決めるのは、他を守るためです。
間隔を空けて試し直す
諦めたあと、すぐ同じ相手へ投げ直すのは逆効果です。
相手が詰まっているときに投げ直せば、詰まりをこちらで増やすことになります。
Python
# 1回目のあと 100ミリ秒待つ
# 2回目のあと 200ミリ秒待つ
# 3回目のあと 400ミリ秒待つ ← 倍にしていく倍にしていくのは、相手が回復する時間を作るためです。
上限を決めます。何倍になっても、ある値より長くは待ちません。
上限が無いと、3回目で1秒、10回目で1分を超えます。待ち時間が人の我慢を超えたら、その再試行は誰の役にも立ちません。
演習
試す回数・最初の待ち時間・待ち時間の上限から、待ち時間の並びと合計を返します。
要件
- 待つのは試行と試行の間だけ。試す回数が max_attempts なら待つ回数は max_attempts - 1 回
- i 回目の待ち時間は base_ms × 2 の i 乗。ただし cap_ms を超えたら cap_ms にする。i は 0 から数える
- 試す回数が1回以下なら waits は空、total_ms は 0
ヒント
編集 ゆめさく編集部