令牌桶演算法的目的放置流量激增導致的一些不良影響,通過令牌的方式進行服務,對激增的流量不提供服務,保證系統的穩定性。
令牌桶的基本簡單說就是在乙個桶中勻速放入令牌(桶中的令牌是有上限的),如果桶中有令牌,就取走乙個令牌,進行服務,若沒有就判斷與上次取令牌的時間,用時間乘以放入速度獲取令牌,再沒有令牌就拒絕服務。簡單示意圖如下所示:
//令牌桶的配額
#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的時候,主要的業務就是讓使用者查詢商品,以及購買支付,此時,金幣查詢 積分查詢等業務就是次要的,因此要對這些服務進行服務的降級,典型的服務降級演算...