提供Discuz ,ECShop ,PHPCMS ,帝国CMS ,CSS教程 ,PHP教程 ,DedeCMS ,WordPress ,HTML教程等cms问题查询.
当前位置: PHP问题 > php怎样对api接口限流【php问题】,php,api,接口,限流

什么是接口限流

那末什么是限流呢?望文生义,限流就是限制流量,包含并发的流量和肯定时候内的总流量,就像你宽带包了1个G的流量,用完了就没了,所以掌握你的运用频次和单次运用的总斲丧。经由过程限流,我们可以很好地掌握体系的qps,从而抵达庇护体系或许接口服务器稳固的目标。

接口限流的经常使用算法

计数器法

计数器法是限流算法里最简朴也是最轻易完成的一种算法。比方我们划定,关于A接口来讲,我们1分钟的接见次数不能凌驾100个。那末我们可以这么做:在一开始的时刻,我们可以设置一个计数器counter,每当一个要求过来的时刻,counter就加1,假如counter的值大于100而且该要求与第一个要求的间隔时候还在1分钟以内,那末申明要求数过量;假如该要求与第一个要求的间隔时候大于1分钟,且counter的值还在限流范围内,那末就重置counter,细致算法的示意图以下:

伪代码以下:

class CounterDemo{
    private  $timeStamp;
    public  $reqCount=0;
    public  $limit=100;//时候窗口内最大要求数
    public $interval=1000; //时候窗口 ms
    public function __construct()
    {
        $this->timeStamp = time();
    }
    public  function grant(){
        $now=time();
        if($now<$this->timeStamp+$this->interval){
            //时候窗口内
            $this->reqCount++;
            return $this->reqCount<=$this->limit;
        }else{
            // 超时后重置
            $this->timeStamp=time();
            $this->reqCount=1;
            return true;
        }
    }
}

这个算法看起来简朴然则有个很严重的题目,那就是临界题目,看下图:

从上图中我们可以看到,假定有一个歹意用户,他在0:59时,霎时发送了100个要求,而且1:00又霎时发送了100个要求,那末实在这个用户在 1秒内里,霎时发送了200个要求。我们适才划定的是1分钟最多100个要求,也就是每秒钟最多1.7个要求,用户经由过程在时候窗口的重置节点处突发要求, 可以霎时凌驾我们的速率限制。用户有可以经由过程算法的这个破绽,霎时压垮我们的运用。

相干引荐:《php教程》

智慧的朋侪可以已看出来了,适才的题目实在是由于我们统计的精度太低。那末怎样很好地处置惩罚这个题目呢?或许说,怎样将临界题目的影响下降呢?我们可以看下面的滑动窗口算法。

滑动窗口算法

在上图中,全部赤色的矩形框示意一个时候窗口,在我们的例子中,一个时候窗口就是一分钟。然后我们将时候窗口举行分别,比方图中,我们就将滑动窗口 划成了6格,所以每格代表的是10秒钟。每过10秒钟,我们的时候窗口就会往右滑动一格。每个格子都有本身自力的计数器counter,比方当一个要求 在0:35秒的时刻抵达,那末0:30~0:39对应的counter就会加1。

那末滑动窗口怎样处理适才的临界题目的呢?我们可以看上图,0:59抵达的100个要求会落在灰色的格子中,而1:00抵达的要求会落在橘黄色的格 子中。当时候抵达1:00时,我们的窗口会往右挪动一格,那末此时时候窗口内的总要求数目一共是200个,凌驾了限制的100个,所以此时可以检测出来触发了限流。

我再来回忆一下适才的计数器算法,我们可以发明,计数器算法实在就是滑动窗口算法。只是它没有对时候窗口做进一步地分别,所以只要1格。

因而可知,当滑动窗口的格子分别的越多,那末滑动窗口的转动就越腻滑,限流的统计就会越准确。

漏桶算法

漏桶算法,又称leaky bucket。为了明白漏桶算法,我们看一下维基百科上的关于该算法的示意图:

从图中我们可以看到,全部算法实在非常简朴。起首,我们有一个牢固容量的桶,有水流进来,也有水流出 去。关于流进来的水来讲,我们没法估计一共有若干水会流进来,也没法估计水流的速率。然则关于流出去的水来讲,这个桶可以牢固水流出的速率。而且,当桶满了以后,过剩的水将会溢出。

我们将算法中的水换成现实运用中的要求,我们可以看到漏桶算法天生就限制了要求的速率。当运用了漏桶算法,我们可以保证接口会以一个常速速率来处置惩罚要求。所以漏桶算法天生不会涌现临界题目。细致的伪代码完成以下:

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;
        }
    }
}

令牌桶算法

令牌桶算法,又称token bucket。为了明白该算法,我们再来看一下维基百科上对该算法的示意图:

从图中我们可以看到,令牌桶算法比漏桶算法稍显庞杂。起首,我们有一个牢固容量的桶,桶里存放着令牌(token)。桶一开始是空的,token以一个牢固的速率r往桶里添补,直到抵达桶的容量,过剩的令牌将会被抛弃。每当一个要求过来时,就会尝试从桶里移除一个令牌,假如没有令牌的话,要求没法经由过程。

细致的伪代码完成以下:

class TokenBucketDemo{
    private  $timeStamp;
    public  $capacity;// 桶的容量
    public  $rate; // 令牌放入的速率
    public  $tokens;// 当前令牌的数目
    public function __construct()
    {
        $this->timeStamp = time();
    }
    public  function grant(){
        $now=time();
        $this->tokens=min(0,$this->tokens+($now-$this->timeStamp)*$this->rate);// 先实行漏水,盘算盈余水量
        $this->timeStamp=$now;
        if($this->tokens<1){
            // 若不到1个令牌,则谢绝
            return false;
        }else{
            // 另有令牌,领取令牌
            $this->tokens -= 1;
            return true;
        }
    }
}

临界题目

我们再来考虑一下临界题目的场景。在0:59秒的时刻,由于桶内积满了100个token,所以这100个要求可以霎时经由过程。然则由于token是以较低的 速率添补的,所以在1:00的时刻,桶内的token数目不可以抵达100个,那末此时不可以再有100个要求经由过程。所以令牌桶算法可以很好地处理临界题目。下图比较了计数器(左)和令牌桶算法(右)在临界点的速率变化。我们可以看到虽然令牌桶算法许可突发速率,然则下一个突发速率必须要等桶内有充足的token后才发作。

总结

计数器算法是最简朴的算法,可以看成是滑动窗口的低精度完成。滑动窗口由于须要存储多份的计数器(每个格子存一份),所以滑动窗口在完成上须要更多的存储空间。也就是说,假如滑动窗口的精度越高,须要的存储空间就越大。

漏桶算法 VS 令牌桶算法

漏桶算法和令牌桶算法最显著的区别是令牌桶算法许可流量肯定水平的突发。由于默许的令牌桶算法,取走token是不须要消耗时候的,也就是说,假定桶内有100个token时,那末可以霎时许可100个要求经由过程。

令牌桶算法由于完成简朴,且许可某些流量的突发,对用户友爱,所以被业界采用地较多。固然我们须要细致情况细致分析,只要最合适的算法,没有最优的算法。

以上就是php怎样对api接口限流的细致内容,更多请关注ki4网别的相干文章!

「梦想一旦被付诸行动,就会变得神圣,如果觉得我的文章对您有用,请帮助本站成长」

分享到:
赞(0) 打赏

支付宝扫一扫打赏

微信扫一扫打赏

标签:

上一篇:

下一篇:

相关推荐

0 条评论关于"php怎样对api接口限流【php问题】,php,api,接口,限流"

最新评论

    暂无留言哦~~

博客简介

看古风美女插画Cos小姐姐,素材合集图集打包下载:炫龙网,好看二次元插画应有尽有,唯美小姐姐等你来。

友情链接

他们同样是一群网虫,却不是每天泡在网上游走在淘宝和网游之间、刷着本来就快要透支的信用卡。他们或许没有踏出国门一步,但同学却不局限在一国一校,而是遍及全球!申请交换友链

服务热线:
 

 QQ在线交流

 旺旺在线