什么是漏桶算法?
漏桶(Leaky Bucket)算法思路很简单,水(请求)先进入到漏桶里,漏桶以一定的速度出水(接口有响应速率),当水流入速度过大会直接溢出(访问频率超过接口响应速率), 然后就拒绝请求,可以看出漏桶算法能强行限制数据的传输速率.
可见这里有两个变量,一个是桶的大小,支持流量突发增多时可以存多少的水(burst),另一个是水桶漏洞的大小(rate)
<?php
class LeakyDemo{
private $timeStamp;
public $capacity;// 桶的容量
public $rate; // 水漏出的速度
public $water;// 当前水量(当前累积请求数)
public function __construct()
{
$this->timeStamp = time();
}
public function grant(){
$now=time();
$this->water=max(0,$this->water-($now-$this->timeStamp)*$this->rate);// 先执行漏水,计算剩余水量
$this->timeStamp=$now;
if(($this->water+1)<$this->capacity){
// 尝试加水,并且水还未满
$this->water+=1;
return true;
}else{
// 水满,拒绝加水
return false;
}
}
}