1. 程式人生 > >java實現系統限流及IP限流

java實現系統限流及IP限流

高併發系統下, 有三把利器 快取 降級 限流.

  • 快取: 將常用資料快取起來, 減少資料庫或者磁碟IO
  • 降級: 保護核心系統, 降低非核心業務請求響應
  • 限流: 在某一個時間視窗內對請求進行限速, 保護系統

 本文主要介紹限流, 常見限流演算法中又分為計數器演算法, 漏桶演算法, 令牌桶演算法.

計數器演算法

比較簡單, 直接用一個map + counter即可實現. 請求來了, 以IP為key,

查詢下之前響應次數, 如果呼叫次數超出MAX_COUT, 返回失敗, 屬於簡單粗暴型選手.

漏桶演算法

請求全部進入漏桶, 漏桶恆定速率輸出反饋. 這樣可以保證資料傳輸平滑,

但是無法預防突發大量請求,

一秒來了100個請求, 都要阻塞排隊, 從小水管輸出資料.

 

令牌桶演算法

令牌桶是以固定速度往桶裡存令牌, 例如一秒存1000個令牌, 業務請求來了, 直接從桶裡獲取令牌響應輸出.

跟漏桶的差異在於, 他可以預存令牌, 如果一秒鐘來了100個請求, 桶裡有100個令牌,

那麼可以立刻響應給客戶端, 而不是排隊輸出.

 

令牌桶的實現

guava中提供了令牌桶的一個封裝實現RateLimiter, 可以直接呼叫, 省的我們自己包裝ConcurrentHashMap + Timer.

我們預設的場景是伺服器端提供一個API供不同客戶端查詢, 要限流每個IP每秒只能呼叫兩次該API.

首先要定義一個伺服器端的快取, 定期清理即可, 快取 IP : 令牌桶