限流器是一種限制某種操做在必定時間內的執行次數(例如每秒鐘5次)或者執行量(例如每秒鐘1G大小的數據)的機制。算法
限流器是一種防護性的編程實現方式,在大數據量高併發訪問時,常常會出現服務或接口面對暴漲的請求而不可用的狀況,甚至引起連鎖反映致使整個系統崩潰。此時你須要使用的技術手段之一就是限流,當請求達到必定的併發數或速率,就進行等待、排隊、降級、拒絕服務等。編程
在一個大型的分佈式系統,系統設計要考慮不少不少方面:緩存
舉一個簡單的例子:假設一個商城,有下單和查看本身的訂單這兩個業務。限量秒殺的時候,用戶下單量在某一時候忽然飈高。系統目前容量可能不夠承擔這麼大的併發下單量,致使請求阻塞,排隊,並進而致使全部的資源都被下單請求吃掉,用戶查看本身訂單的請求也沒法執行或者很慢。同時,用戶請求刷不出來就會不斷地刷,致使進一步請求堆積。併發
若是徹底不採用限流器,通常須要經過設置適當的請求超時,儘可能小的同步等待隊列和合適的斷路策略,來防止過載。可是,這種方式並不能避免上面說的4個問題。負載均衡
在目前的微服務體系中,通常一個進程既是服務提供方,又是服務調用方。在服務網格下更是如此。對於服務提供方,限流主要是控制外部流量防止壓力過大。對於服務調用的時候限流,主要是考慮壓力均勻(雖然服務調用通常有負載均衡算法,可是通常的負載均衡算法無法保證真正的負載徹底均衡,客戶端限流器能夠進一步幫助防止壓力所有打到了某一個實例)。分佈式
對於服務端限流,當觸發限流的時候,服務端通常會拒絕請求,而且可能返回 429 這個 HTTP 狀態碼。客戶端是這個請求直接異常,仍是緩存起來以後繼續重試,取決於客戶端的策略。ide
每日一刷,輕鬆提高技術,斬獲各類offer:微服務