前因:由於本系統中,有大數據高併發的場景。在向下遊系統發送請求的時候,須要限流。不然會形成下游系統的堵塞。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次方法執行就沒限流效果了。