降級
降級是當服務出問題或者影響到核心流程的效能時需要暫時遮蔽掉某些功能,等高峰或者問題解決後再開啟。降級一般有幾種實現手段,自動降級和人工降級:
1、通過配置降級開關,實現對流程的控制
2、前置化降級開關, 基於 openresty+配置中心實現降級
3、業務降低,比如在大促的時候,會優先保證核心業務的流程可用
限流
限流是對資源訪問做控制,防止惡意請求流量、惡意攻擊、或者防止流量超過系統峰值。
它有兩個核心概念:
資源:被流量控制的物件,比如介面
策略:由限流演算法和可調節的引數兩部分組成
漏桶演算法
桶本身具有乙個恆定的速率往下漏水,而上方時快時慢的會有水進入桶內。當桶還未滿時,上方的水可以加入。一旦水滿,上方的水就無法加入。
桶滿正是演算法中的乙個關鍵的觸發條件(即流量異常判斷成立的條件)。而此條件下如何處理上方流下來的水,有兩種方式:暫時攔截住上方水的向下流動,等待桶中的一部分水漏走後,再放行上方水
溢位的上方水直接拋棄
令牌桶演算法(能夠解決突發流量)
令牌桶演算法是網路流量整形(traffic shaping)和速率限制(rate limiting)中最常使用的一種演算法。典型情況下,令牌桶演算法用來控制傳送到網路上的資料的數目,並允許突發資料的傳送。
令牌桶是乙個存放固定容量令牌(token)的桶,按照固定速率往桶裡新增令牌;
令牌桶演算法實際上由三部分組成:兩個流和乙個桶,分別是令牌流、資料流和令牌桶
gu**a 的 ratelimiter 實現
在 gu**a 中 ratelimiter 的實現有兩種: bursty 和 warmup
bursty
bursty 基於令牌桶的演算法實現。
ratelimiter ratelimiter=ratelimiter.create(permitpersecond); //建立乙個 bursty例項。
ratelimiter.acquire(); //獲取 1 個 permit,當令牌數量不夠時會阻塞直到獲取為止
warmingup
warmingup基於漏桶的演算法實現,qps 是固定的,使用於需要預熱時間的使用場景。
ratelimiter ratelimiter =ratelimiter.create(permitspersecond,warmupperiod,timeunit);//warmupperiod 是指預熱的時間
ratelimiter.acquire();//獲取 1 個 permit
public參考:class
tokendemo
public
tokendemo processwithtokenbucket()
public
tokendemo processwithleakybucket()
private
void
processrequest()
long end=system.currenttimemillis()-start;
system.out.println("處理請求數量:"+countofreq+"," +
"耗時:"+end+"," +
"qps:"+ratelimiter.getrate()+"," +
"實際 qps:"+math.ceil(countofreq / (end / 1000.00)));
} public
void doprocess() throws
interruptedexception
} public
static
void main(string args) throws
interruptedexception
}
高併發場景下的限流策略
目錄快取 降級 限流 漏桶演算法 令牌桶演算法 漏桶演算法與令牌桶演算法的區別 有效提公升熱點資料的訪問效率,在高併發 大流量的場景降低服務端壓力。當訪問量快速增長 服務可能會出現一些問題 響應超時 或者會存在非核心服務影響到核心流程的效能時,仍然需要保證服務的可用性,即便是有損服務。所以意味著我們...
Java高併發系統的限流策略
在大資料量高併發訪問時,經常會出現服務或介面面對暴漲的請求而不可用的情況,甚至引發連鎖反映導致整個系統崩潰。此時你需要使用的技術手段之一就是限流,當請求達到一定的併發數或速率,就進行等待 排隊 降級 拒絕服務等。在開發高併發系統時有三把利器用來保護系統 快取 降級和限流。快取比較好理解,在大型高併發...
高併發限流演算法
目錄開篇 限流演算法 1.漏桶 leaky bucket 2.令牌桶 token bucket 資料流漏桶演算法和令牌桶演算法的比較 參考資料 在高併發系統中,有很多手段來保護系統,如快取 降級和限流等。快取 讓資料盡早進入快取,離程式近一點,不要大量頻繁的訪問db,可提供系統訪問速度和增大系統處理...