序言
公司是做互联网金融,代码是用的几年前老板和他朋友一起写的代码,代码各种文档没有,数据库备注没有,属性注释缺少的等等问题,我们就先不吐槽了!先来说说最近遇到的问题,最开始项目就跑了一个Tomcat,是不是很屌(哈哈哈),然后最近用户量起来了,一天能有5K+的新用户注册,然后公司就做了集群,4台服务器,为了部署成集群环境,改了多少东西也先不说了,说多了都是泪。然后最近出了几个活动,导致用户量在同一时间内请求量很集中,服务器压力很大,但是活动就是一时的,不想增加成本买服务器,就决定,限制每台服务器的并发数量,然后超过的请求直接返回错误,让用户稍后再试!然后就有了今天的文章,接口限流处理。
限流算法
常用的限流算法有两种:漏桶算法和令牌桶算法。
漏桶算法思路很简单,请求先进入到漏桶里,漏桶以一定的速度出水,当水请求过大会直接溢出,可以看出漏桶算法能强行限制数据的传输速率。
对于很多应用场景来说,除了要求能够限制数据的平均传输速率外,还要求允许某种程度的突发传输。这时候漏桶算法可能就不合适了,令牌桶算法更为适合。如图2所示,令牌桶算法的原理是系统会以一个恒定的速度往桶里放入令牌,而如果请求需要被处理,则需要先从桶里获取一个令牌,当桶里没有令牌可取时,则拒绝服务。
实现
我看到了网上使用guava提供了限流工具类RateLimiter提供了限流工具类RateLimiter,所以这里写个简单的demo,该类基于“令牌桶算法”,非常方便使用。该类的接口描述请参考:RateLimiter接口描述,具体的使用请参考:RateLimiter使用实践。