這個(gè)描述不嚴(yán)謹(jǐn),并不是“發(fā)出的是6枚”慈省,源碼里面com.google.common.util.concurrent.SmoothRateLimiter#reserveEarliestAvailable個(gè)方法在取令牌時(shí)区岗,如果令牌大于0并且小于1的情況下會(huì)發(fā)生令牌預(yù)支付略板。假如桶內(nèi)滿5個(gè)令牌,前5個(gè)請求進(jìn)來慈缔,消耗完了這5個(gè)令牌叮称,但是這5個(gè)請求也是會(huì)耗時(shí)的,時(shí)間會(huì)繼續(xù)往前推胀糜,第6個(gè)請求進(jìn)來的時(shí)候颅拦,桶內(nèi)令牌數(shù)大于0并且小于1(可以看com.google.common.util.concurrent.SmoothRateLimiter#resync這個(gè)方法是怎么計(jì)算桶內(nèi)存儲(chǔ)的令牌數(shù)的),此時(shí)發(fā)生令牌預(yù)支付教藻,并將 nextFreeTicketMicros 向后推距帅,故第6個(gè)請求可以接收。
Guava-RateLimiter詳解常用的限流算法有漏桶算法和令牌桶算法括堤,guava的RateLimiter使用的是令牌桶算法碌秸,也就是以固定的頻率向桶中放入令牌,例如一秒鐘10枚令牌悄窃,實(shí)際業(yè)務(wù)在每次響應(yīng)請求之前...