網路限流令牌桶演算法原理及實現

2021-09-28 11:25:41 字數 934 閱讀 4941

令牌桶演算法的目的放置流量激增導致的一些不良影響,通過令牌的方式進行服務,對激增的流量不提供服務,保證系統的穩定性。

令牌桶的基本簡單說就是在乙個桶中勻速放入令牌(桶中的令牌是有上限的),如果桶中有令牌,就取走乙個令牌,進行服務,若沒有就判斷與上次取令牌的時間,用時間乘以放入速度獲取令牌,再沒有令牌就拒絕服務。簡單示意圖如下所示:

//令牌桶的配額

#define limit_flow_max_token 100

//令牌桶的新增速度

#define limit_flow_speed 10

time_t before_time =0;

int tokens =0;

bool

tokens_bucket()

if(tokens >0)

//沒有令牌比較時間差,補充令牌

time_t now_time =

time(0

);//如果時間差為0,瞬間取走了所有的令牌,拒絕服務

if(now_time == before_time)

return

false

; tokens +

=(now_time - before_time)

* limit_flow_speed;

before_time = now_time;

if(tokens > limit_flow_max_token)

tokens = limit_flow_max_token;

--tokens;

return

true

;}

令牌桶演算法原型只能應用於常見的應用場景,在高併發的情況下,可能就不適用了;

springgateway限流 令牌桶演算法

參見 lua指令碼 參見spring spring cloud gateway core包下的request rate limiter.lua redis從2.6版本開始引入對lua指令碼的支援,通過在伺服器中嵌入lua環境,redis客戶端可以使用lua指令碼,直接在伺服器端原子地執行多個redi...

php令牌桶演算法實現介面限流

前端每次請求從令牌桶取走令牌,後端勻速向桶內投遞令牌,如果前端取到令牌,則說明這次請求有效,否則讓前端再次請求或者等待。避免了大量請求下伺服器壓力過大導致的崩潰問題。令牌桶類 class token catch redi ception exception 令牌初始化 public function...

服務治理 限流(令牌桶演算法)

1 最近在寫乙個分布式服務的框架,對於分布式服務的框架來說,除了遠端呼叫,還要進行服務的治理 當進行 的時候,所有的資源都用來完成重要的業務,就比如雙11的時候,主要的業務就是讓使用者查詢商品,以及購買支付,此時,金幣查詢 積分查詢等業務就是次要的,因此要對這些服務進行服務的降級,典型的服務降級演算...