详解Redisson分布式限流的实现原理

 我们目前在工作中遇到一个性能问题,我们有个定时任务需要处理大量的数据,为了提升吞吐量,所以部署了很多台机器,但这个任务在运行前需要从别的服务那拉取大量的数据,随着数据量的增大,如果同时多台机器并发拉取数据,会对下游服务产生非常大的压力。之前已经增加了单机限流,但无法解决问题,因为这个数据任务运行中只有不到10%的时间拉取数据,如果单机限流限制太狠,虽然集群总的请求量控制住了,但任务吞吐量又降下来。如果限流阈值太高,多机并发的时候,还是有可能压垮下游。 所以目前唯一可行的解决方案就是分布式限流

  我目前是选择直接使用Redisson库中的RRateLimiter实现了分布式限流,关于Redission可能很多人都有所耳闻,它其实是在Redis能力上构建的开发库,除了支持Redis的基础操作外,还封装了布隆过滤器、分布式锁、限流器……等工具。今天要说的RRateLimiter及时其实现的限流器。接下来本文将详细介绍下RRateLimiter的具体使用方式、实现原理还有一些注意事项,最后简单谈谈我对分布式限流底层原理的理解。

RRateLimiter使用

  RRateLimiter的使用方式异常的简单,参数也不多。只要创建出RedissonClient,就可以从client中获取到RRateLimiter对象,直接看代码示例。

RedissonClient redissonClient = Redisson.create();
RRateLimiter rateLimiter = redissonClient.getRateLimiter("xindoo.limiter");
rateLimiter.trySetRate(RateType.OVERALL, 100, 1, RateIntervalUnit.HOURS); 
复制代码

  rateLimiter.trySetRate就是设置限流参数,RateType有两种,OVERALL是全局限流 ,PER_CLIENT是单Client限流(可以认为就是单机限流),这里我们只讨论全局模式。而后面三个参数的作用就是设置在多长时间窗口内(rateInterval+IntervalUnit),许可总量不超过多少(rate),上面代码中我设置的值就是1小时内总许可数不超过100个。然后调用rateLimiter的tryAcquire()或者acquire()方法即可获取许可。

rateLimiter.acquire(1); // 申请1份许可,直到成功
boolean res = rateLimiter.tryAcquire(1, 5, TimeUnit.SECONDS); // 申请1份许可,如果5s内未申请到就放弃
复制代码

  使用起来还是很简单的嘛,以上代码中的两种方式都是同步调用,但Redisson还同样提供了异步方法acquireAsync()和tryAcquireAsync(),使用其返回的RFuture就可以异步获取许可。

RRateLimiter的实现

  接下来我们顺着tryAcquire()方法来看下它的实现方式,在RedissonRateLimiter类中,我们可以看到最底层的try

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值