前因:因为本系统中,有大数据高并发的场景。在向下游系统发送请求的时候,需要限流。否则会造成下游系统的堵塞。
实现方案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次方法执行就没限流效果了。