なぜ制限するか
1人の使いすぎで全員が止まる
席の予約サービスに、1秒間に500回も空席を問い合わせてくる相手がいるとします。
悪意があるとはかぎりません。書いたプログラムが待たずに繰り返しているだけのことも多いです。
理由がどれであれ、結果は同じです。他の全員の応答が遅くなります。
増やせば、その相手も増えたぶんだけ使います。
上限を決めない限り、使う量は用意した量まで伸びます。 増やした資源は、いつも一番速く叩く相手が先に取ります。
目的を先に決める
上限を入れる前に、何のために入れるかを決めます。目的で方式が変わるからです。
全員を公平にしたいのか、下流を守りたいのか、料金の段階を作りたいのかで、選ぶ方式が違います。
Python
# 1分あたり60回まで、という上限
# 超えた要求は 429 を返して断る断らなければ、その人以外の全員が遅くなります。
断るのは1人を切るためではなく、残りを守るためです。誰を守るかを決めていないと、上限の数字も決められません。
演習
届いた要求の並びと1人あたりの上限から、通すか断るかを1件ずつ決めます。
要件
- 相手ごとに通した回数を数える。通した回数が limit に達していたら "blocked"、まだなら "allowed" にして回数を1増やす
- decisions には要求と同じ並びで "allowed" か "blocked" を入れる
- blocked には、断った回数を相手ごとに入れる。1度も断っていない相手は入れない
ヒント
編集 ゆめさく編集部