使用openresty插件对nginx进行QPS限速

本文介绍了如何利用lua-resty-limit-traffic模块在OpenResty/ngx_lua中实现QPS限制,对比了漏桶算法和令牌桶算法,提供了一种平滑处理请求和应对突发流量的解决方案。在Windows环境下,配置nginx并使用共享字典存储访问信息,通过重启nginx观察限速效果。
摘要由CSDN通过智能技术生成

最近收到个给接口限制QPS的需求,起初不知道从哪入手,折腾了几天,终于找到了些方案,在此记录一下吧。

限速常见算法

漏桶算法(leaky bucket)

算法原理大概如图
在这里插入图片描述
大致可理解为

  • 水(请求)从上方倒入水桶,从水桶下方流出(被处理);
  • 来不及流出的水存在水桶中(缓冲),以固定速率流出;
  • 水桶满后水溢出(丢弃)。

这里我个人理解为:
强调的是匀速处理请求,毕竟水是匀速流出的。

令牌桶算法(token bucket)

算法原理大概如图
在这里插入图片描述
基本思想:

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

然而令牌桶算法中,最大不同是它多了这个桶,它可以把令牌(可以理解为通行证)缓存起来,也就是说在某个时间段内,它可以不均匀的消耗令牌。

举个栗子:某个接口允许每秒100的QPS。
漏桶算法:平均到毫秒的话,大概就是每10ms允许通过一个请求,它强调匀速。
令牌桶算法:它则可以在前10ms通过全部的100个请求,剩余的时间不让通过(实际有些不同,毕竟受限于令牌桶容量以及它令牌是匀速产生的)。

nginx限速

下面使用的是 lua-resty-limit-traffic,该模块主要用于在OpenResty/ngx_lua中控制流量。
其中QPS限制主要有两种模式,即resty.limit.reqresty.limit.count

相关环境为Windwos上使用openresty。

resty.limit.req

这个是类似前面漏桶算法的实现。使用方法如下:
nginx.conf文件部分内容

        location /other {
   
            access_by_lua_block {
   
                -- https://github.com/openresty/lua-resty-limit-traffic

                -- well, we could put the require() and new() calls in our own Lua
                -- modules to save overhead. here we put them below just for
                -- convenience.

                local limit_req = require "resty.limit.req"

                -- limit the requests under 200 req/sec with a burst of 100 req/sec,
                -- that is, we delay requests under 300 req/sec and above 200
                -- req/sec, and reject any requests exceeding 300 req/sec.
                -- 关键是这两个参数,正常即200QPS,瞬间的话允许300QPS
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值