nginx中限流算法有哪些

发布时间:2021-11-17 10:34:26 作者:小新
来源:亿速云 阅读:176

这篇文章主要介绍nginx中限流算法有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

为什么需要限流

正常的业务量增长不是瞬时的,可以采用应用实例或者数据库实例的垂直或水平伸缩应对,而限流针对场景主要两种:

  1. 网络攻击、爬虫程序

  2. 热点事件触发业务(如各平台营销活动、微博热点话题)

限流算法

1、计数器算法

原理:请求达到时计数器+1,然后比较当前计数是否达到阈值。

具体有两种实现:

1.1 判断系统正在处理的请求数是否达到阈值

请求处理前计数器+1,请求处理完成计数器-1,比如要控制系统同时处理的请求不超过100个。

static AtomicInteger runningThread = new AtomicInteger(0);
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    if (runningThread.get() > MAX_VALUE) {
    return getVoidMono(exchange, BaseResult.builder().code("SYSTEM_BUSY").message("系统繁忙").build());
    }
    runningThread.getAndIncrement();
    Mono<Void> mono = chain.filter(exchange)
    .then(Mono.fromRunnable(() -> runningThread.getAndDecrement()));
    return mono;
}

1.2  判断单位时间内请求数是否达到阈值

如:每分钟处理请求不超过100个。

public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    //redis键值自增,key不存在时自动创建,初始值为0
    Long v = redisTemplate.opsForValue().increment(key, 1L);
    //初始化生效时间
    if (v == 1) {
    redisTemplate.expire(key, 1L, TimeUnit.MINUTES);
    }
    //请求数大于阈值拦截处理
    if (v > MAX_VALUE) {
    return getVoidMono(exchange, BaseResult.builder().code("SYSTEM_BUSY").message("系统繁忙").build());
    }
    return chain.filter(exchange);
}

这种限流方法有明显的缺陷,如下图,分别看两个单位时间内的并发数是被限制到每分钟100个请求了,但是如果请求如果集中分布在第一分钟的最后一秒和第二分钟的第一秒之间,算出的并发成了每秒100个请求。

nginx中限流算法有哪些

2、滑动窗口算法

滑动窗口本质上还是计数器算法,只是采用了更加细粒度的计数,对滚动区间进行计数。针对上述问题,将1分钟拆分为10个格子即每10秒一次滑动,统计当前一分钟窗口内的总计数。针对上述的问题,把一分钟拆成60个格子,即每秒一次滑动。00:59秒进入100个请求,01:00的请求则被限流拦截。

nginx中限流算法有哪些

so 滑动窗口的本质是对粗粒度限流一定程度的优化,假如一开始就用极细粒度时间间隔做计数统计,也能实现较为精确的限流,但同时因为频繁的进行计数器的重置牺牲部分效率。

3、 漏桶算法

原理:请求排队,系统匀速取出排队请求进行处理。

漏桶很形象,不管进水速度如何,漏孔滴水的速率是匀速稳定的。

nginx中限流算法有哪些

4、令牌桶算法

划重点,目前应用比较广泛的算法。

原理: 比如每分钟/秒产生一定数目的令牌到令牌桶中(令牌桶满则忽略),请求到达时网关获取令牌成功则处理,失败则触发限流逻辑。

nginx中限流算法有哪些

Google开源工具包Guava提供了基于令牌桶算法的限流工具类RateLimiter。

详细用法 :https://cloud.tencent.com/developer/article/1408819

//每秒生成10个令牌,5秒预热时间。
static RateLimiter rateLimiter = RateLimiter.create(10, 5, TimeUnit.SECONDS);

@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    if (!rateLimiter.tryAcquire()) {
    return getVoidMono(exchange, BaseResult.builder().code("SYSTEM_BUSY").message("系统繁忙").build());
    }
    return chain.filter(exchange);
}

以上是“nginx中限流算法有哪些”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!

推荐阅读:
  1. Nginx怎么实现限速限流
  2. Nginx怎么实现限流

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

nginx

上一篇:ssh怎么用

下一篇:jquery如何获取tr里面有几个td

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》