トークンバケット
溜めておいて、一気に使える
前回は回数を数えるだけでした。今回は時間を入れます。
入れ物に札を溜めておき、要求が来るたびに1枚使います。札が無ければ断ります。
札は時間とともに一定の速さで増え、入れ物の大きさまで溜まります。
Python
# 入れ物5枚、毎秒1枚ずつ増える
# 何もしないと5枚まで溜まるなっています。一瞬は5回まで、続けるなら毎秒1回までです。
人の使い方は均一ではありません。画面を開いた瞬間に4回、そのあとしばらく何もしない、という形です。溜められる仕組みは、その形をそのまま通します。
長い目で見ると速さは変わらない
溜めた札を使い切れば、あとは増える速さでしか使えません。
1分間で使える回数は、溜めた5枚を足しても毎秒1枚 × 60秒 + 5枚です。長く見るほど、5枚の差は小さくなります。
叩けます。だから入れ物の大きさは、一度に来てよい最大の数として決めます。
増える速さが平均の上限、入れ物の大きさが突発の上限です。2つの数字が別々の意味を持つのが、この方式の要点です。
演習
時刻つきの要求と、入れ物の大きさ・増える速さから、通すか断るかを決めます。
要件
- はじめは入れ物いっぱいに札がある。前の要求からの経過秒 × refill_per_second だけ札を増やす。ただし capacity を超えない
- 経過秒は、前の要求の at との差。1件目は at との差をそのまま使う(はじめの時刻は0とする)
- 札が cost 以上あれば "allowed" にして cost だけ減らす。足りなければ "blocked" にして減らさない
ヒント
編集 ゆめさく編集部