リーキーバケット
出ていく速さを一定にする
トークンバケットは入ってくる速さを抑える方式でした。
リーキーバケットは出ていく速さを一定にします。入れ物に穴が開いていて、一定の速さで漏れていくと考えます。
要求が来たら入れ物に足します。入れ物がいっぱいなら断ります。
Python
# 入れ物3つ、毎秒1つずつ漏れる
# 3つ入っている状態で4つ目 → 断る下流に届く形が違います。
トークンバケットは、溜めた札で一気に5件を通します。5件がそのまま下流へ届きます。
リーキーバケットは、何件来ても下流へは毎秒1件ずつしか流れません。
下流が一定しか受けられないときに使う
外の決済サービスが毎秒10件までしか受け付けない、という場面があります。
こちらが突発を許すと、下流が溢れます。上流で突発を吸って、一定にして渡すのがこの方式の役目です。
あります。突発を平らにすると、待ち時間が生まれます。
画面を開いた瞬間に4件叩く利用者は、リーキーバケットだと3件目と4件目を待たされます。下流が耐えられるなら、待たせないほうがよい体験です。
守る相手が下流か利用者かで、選ぶ方式が変わります。
演習
時刻つきの要求と、入れ物の大きさ・毎秒漏れる数から、通すか断るかを決めます。
要件
- はじめ入れ物は空。要求が来たら、前の要求からの経過秒 × leak_per_second だけ減らす。0 より下にはしない
- 減らしたあとの中身が capacity より少なければ "allowed" にして1つ足す。そうでなければ "blocked" にして足さない
- 経過秒は前の要求の at との差。1件目は at との差をそのまま使う(はじめの時刻は0とする)
ヒント
編集 ゆめさく編集部