收银台系统相对于互联网应用流量要平稳很多,高峰流量也就平时的三倍,完全是可控的,我们这里用限流主要是控制后台同时下载XLS表格的请求数,因为后台系统要提供大量的导出XLS表格功能,收银员与管理人员需要用我们导出的数据去做各种分析(应该是我们的报表功能还不够完善造成的)。
下面整理一下Guaua提供的限流工具以及我们自己的做法
一、使用LoadCaching实现接口限流
思路:创建LoadCaching对象,设置有效期为1秒,缓存Key为时间戳(当前秒数),值是计数器(调用次数累加),如果查询命中计数器自增,当计数器值大于限定值时不处理,如果没有命中,创建一个新的时间戳缓存并初始化值为0,达到限流的目的。
二、使用RateLimter限流
RateLimter限制对资源的访问速率,有两种获取令牌的接口,一种是非阻塞式,拿不到令牌直接返回false,另一种是阻塞式,拿不到令牌等待令牌。
RateLimiter rateLimiter = RateLimiter.create(10)
每秒创建令牌的数量。
三、下载接口请求数量限流
思路:创建一个拦截器,使用redis存储当前下载的请求(生成一个唯一串),判断当前redis该key的size大小,如果超过限定值,就直接返回需要等待的消息,当下载完成后,将该请求唯一串从redis中删除。