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

前因:因为本系统中,有大数据高并发的场景。在向下游系统发送请求的时候,需要限流。否则会造成下游系统的堵塞。

实现方案1:

  Thread.sleep(ms).

优点:简单粗暴,一行代码搞定

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

实现方案2:

  Guava的RateLimiter类

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

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

实现方案3:

  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次方法执行就没限流效果了。

  

原文地址:https://www.cnblogs.com/xujanus/p/9963882.html