业务限流场景简单实现方案:RateLimiter

前因:由于本系统中,有大数据高并发的场景。在向下游系统发送请求的时候,须要限流。不然会形成下游系统的堵塞。html

实现方案1:并发

  Thread.sleep(ms).高并发

优势:简单粗暴,一行代码搞定大数据

缺点:有点low,万一线程被抢了,没法唤醒怎么办ui

 

实现方案2:线程

  Guava的RateLimiter类htm

优势:简单实用,知足简单业务场景的需求。2行代码就能搞定blog

缺点:功能仍是比较简单,限流方案限定在秒级it

 

实现方案3:io

  RXJava的flowable

说明:比RateLimiter复杂,可是功能强大。还没仔细研究过

 

因此综合考虑,使用Guava的RateLimiter类是一个比较好的解决方案,下面附上2篇资料:

1.http://ifeve.com/guava-ratelimiter/

2.https://www.cnblogs.com/f-zhao/p/7210158.html

 

注意要点:RateLimiter 有一个有趣的特性是「前人挖坑后人跳」,也就是说 RateLimiter 容许某次请求拿走超出剩余令牌数的令牌。这就会形成rateLimiter.acquire()这个取令牌的方法,第一次取的时候,确定是秒回的,不会任何停顿。

因此rateLimiter.acquire()必定要放在业务逻辑的最前面,最前面,最前面(重三遍)。我写的时候觉得和Thread.sleep()同样是每次都会停的,结果放在方法最后面,前2次方法执行就没限流效果了。

相关文章
相关标签/搜索