nginx限流算法

时间:2021-6-7 作者:qvyue

1 限流算法

1.令牌桶

nginx限流算法
图片来源于网络,侵权删

算法思想:
*令牌以固定速率产生,并缓存到令牌桶中;
*令牌桶放满时,多余的令牌被丢弃;
*请求要消耗等比例的令牌才能被处理;
*令牌不够时,请求被缓存。
2.漏桶

nginx限流算法
图片来源于网络,侵权删

算法思想:
*水(请求)从上方倒入水桶,从水桶下方流出(被处理);

*来不及流出的水存在水桶中(缓冲),以固定速率流出;
*水桶满后水溢出(丢弃)。
*这个算法的核心是:缓存请求、匀速处理、多余的请求直接丢弃。
总结:
相比漏桶算法,令牌桶算法不同之处在于它不但有一只“桶”,还有个队列,这个桶是用来存放令牌的,队列才是用来存放请求的。 从作用上来说,漏桶和令牌桶算法最明显的区别就是是否允许突发流量(burst)的处理,漏桶算法能够强行限制数据的实时传输(处理)速率,对突发流量不做额处理;而令牌桶算法能够在限制数据的平均传输速率的同时允许某种程度的突发传输。

2 Nginx限速模块

Nginx按请求速率限速模块使用的是漏桶算法,即能够强行保证请求的实时处理速度不会超过设置的阈值。
Nginx主要有两种限速方式:按连接数限速(ngx_http_limit_conn_module)、按请求速率限速(ngx_http_limit_req_module)。

用php实现

/*** 漏桶的大小是固定的,处理速度也是固定的,但是请求的速率的不固定的。在突发的情况下,会丢弃很多请。** */ 
function LeackBucket() { 
    $redis = new Redis(); 
    $redis->connect('127.0.0.1', 6379); 
    //桶的容量 
    $maxCount = 1000; 
    //时间 
    $interval = 10; 
    //每分钟流出的数量 
    $speed = 20; 
    //用户 
    $time = $redis->time(); 
    $key = $time[0].$time[1]; 
    //时间判断 
    $check = $redis->exists('outCount'); 
    if ($check){ 
        //出桶的速率的请求数量 
        $outCount = $redis->incr('outCount'); 
        if ($outCountincr('outCount'); 
        $redis->Expire('outCount',$interval); 
        echo "时间过了";
        exit; 
    } 
}
声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:qvyue@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。