基於 Redis 實現分散式應用限流

發表於2017-09-07

限流的目的是通過對併發訪問/請求進行限速或者一個時間視窗內的的請求進行限速來保護系統,一旦達到限制速率則可以拒絕服務。

前幾天在DD的公眾號,看了一篇關於使用 瓜娃 實現單應用限流的方案,參考《redis in action》 實現了一個jedis版本的,都屬於業務層次限制。 實際場景中常用的限流策略:

  • Nginx接入層限流
    按照一定的規則如帳號、IP、系統呼叫邏輯等在Nginx層面做限流
  • 業務應用系統限流
    通過業務程式碼控制流量這個流量可以被稱為訊號量,可以理解成是一種鎖,它可以限制一項資源最多能同時被多少程式訪問。

程式碼實現

呼叫

優化

使用攔截器 + 註解優化程式碼

攔截器

定義註解

使用

併發測試

工具:apache-jmeter-3.2
說明: 沒有獲取到訊號量的介面返回500,status是紅色,獲取到訊號量的介面返回200,status是綠色。
當限制請求訊號量為2,併發5個執行緒: image
當限制請求訊號量為5,併發10個執行緒:
image

資料

基於reids + lua的實現

總結

  1. 對於訊號量的操作,使用事務操作。
  2. 不要使用時間戳作為訊號量的排序分數,因為在分散式環境中,各個節點的時間差的原因,會出現不公平訊號量的現象。
  3. 可以使用把這塊程式碼抽成@rateLimiter註解,然後再方法上使用就會很方便啦
  4. 不同介面的流控,可以參考原始碼的裡面RedisRateLimiterPlus,無非是每個介面生成一個監控引數
  5. 原始碼http://git.oschina.net/boding1/pig-cloud

相關文章