1娱仔、漏桶算法
請求進(jìn)入漏桶里憨闰,漏桶以一定速度響應(yīng),請求速度過大直接溢出礁阁,拒絕服務(wù)护桦。
2含衔、令牌桶算法
請求獲取token,直到?jīng)]有token可拿二庵,阻塞或者拒絕服務(wù)贪染。
3、RateLimiter工具類之令牌桶算法
配置10個令牌測試
boolean tryAcquire = accessLimitService.getRateLimiter()
.tryAcquire();
if (tryAcquire) {
accessLimitService.addData();
return "success";
} else {
throw new IllegalAccessException("failed");
}
使用jemeter模擬并發(fā)請求測試結(jié)果如下(注:配置n=10個令牌限流催享,實際限制n+1=11個)
4杭隙、其他方法簡介
double acquire(): 從RateLimiter獲取一個許可,該方法會被阻塞直到獲取到請求因妙。
double acquire(int permits):從RateLimiter獲取指定許可數(shù)痰憎,該方法會被阻塞直到獲取到請求。
static RateLimiter create(double permitsPerSecond):根據(jù)指定的穩(wěn)定吞吐率創(chuàng)建RateLimiter攀涵,這里的吞吐率是指每秒多少許可數(shù)(通常是指QPS铣耘,每秒多少查詢)
static RateLimiter create(double permitsPerSecond, long warmupPeriod, TimeUnit unit):根據(jù)指定的穩(wěn)定吞吐率和預(yù)熱期來創(chuàng)建RateLimiter,這里的吞吐率是指每秒多少許可數(shù)(通常是指QPS以故,每秒多少個請求量)蜗细,在這段預(yù)熱時間內(nèi),RateLimiter每秒分配的許可數(shù)會平穩(wěn)地增長直到預(yù)熱期結(jié)束時達(dá)到其最大速率怒详。(只要存在足夠請求數(shù)來使其飽和)
double getRate():返回RateLimiter 配置中的穩(wěn)定速率炉媒,該速率單位是每秒多少許可數(shù)
void setRate(double permitsPerSecond):更新RateLimite的穩(wěn)定速率,參數(shù)permitsPerSecond: 由構(gòu)造RateLimiter的工廠方法提供昆烁。
boolean tryAcquire():從RateLimiter 獲取許可吊骤,如果該許可可以在無延遲下的情況下立即獲取得到的話
boolean tryAcquire(int permits):從RateLimiter 獲取許可數(shù),如果該許可數(shù)可以在無延遲下的情況下立即獲取得到的話
boolean tryAcquire(int permits, long timeout, TimeUnit unit):從RateLimiter 獲取指定許可數(shù)如果該許可數(shù)可以在不超過timeout的時間內(nèi)獲取得到的話善玫,或者如果無法在timeout 過期之前獲取得到許可數(shù)的話水援,那么立即返回false (無需等待)
boolean tryAcquire(long timeout, TimeUnit unit):從RateLimiter 獲取許可如果該許可可以在不超過timeout的時間內(nèi)獲取得到的話,或者如果無法在timeout 過期之前獲取得到許可的話茅郎,那么立即返回false(無需等待)