限流器是一種限制某種操作在一定時間內的執行次數(例如每秒鐘5次)或者執行量(例如每秒鐘1g大小的資料)的機制。
限流器是一種防禦性的程式設計實現方式,在大資料量高併發訪問時,經常會出現服務或介面面對暴漲的請求而不可用的情況,甚至引發連鎖反映導致整個系統崩潰。此時你需要使用的技術手段之一就是限流,當請求達到一定的併發數或速率,就進行等待、排隊、降級、拒絕服務等。
在乙個大型的分布式系統,系統設計要考慮很多很多方面:
系統動態擴容縮容,總會有滯後性。業務總會有高峰有低谷。集群大小不會一直按照高峰的時候的規模執行,這樣成本太高了,一般會有動態擴容策略。但是這種動態擴容,一般是有滯後性的,不能保證瞬時高流量處理的很好。通過限流器,保證某個業務流量到來時,不會以為這個業務導致其他業務也無法正常工作。
級聯故障(cascading failure):分布式系統一般會有健康檢查,也一般會有斷路降級機制,流量高峰到來的時候,當某個節點過載,導致這個節點健康檢查失敗下線,或者斷路器開啟,導致這個節點的流量打入了其他節點導致其他節點也過載。
對於乙個公共服務,不同租戶或者不同使用者都需要限流防止某個使用者將所有的資源都搶光。
流控:為了防止某乙個節點負載特別高,但是其他節點負載較低。除了通過負載均衡控制外,還需要限流器保證某個節點不會壓力過高。
舉乙個簡單的例子:假設乙個**,有下單和檢視自己的訂單這兩個業務。限量秒殺的時候,使用者下單量在某一時候突然飈高。系統目前容量可能不夠承擔這麼大的併發下單量,導致請求阻塞,排隊,並進而導致所有的資源都被下單請求吃掉,使用者檢視自己訂單的請求也無法執行或者很慢。同時,使用者請求刷不出來就會不斷地刷,導致進一步請求堆積。
如果完全不採用限流器,一般需要通過設定適當的請求超時,盡量小的同步等待佇列和合適的斷路策略,來防止過載。但是,這種方式並不能避免上面說的4個問題。
在目前的微服務體系中,一般乙個程序既是服務提供方,又是服務呼叫方。在服務網格下更是如此。對於服務提供方,限流主要是控制外部流量防止壓力過大。對於服務呼叫的時候限流,主要是考慮壓力均勻(雖然服務呼叫一般有負載均衡演算法,但是一般的負載均衡演算法沒法保證真正的負載完全均衡,客戶端限流器可以進一步幫助防止壓力全部打到了某乙個例項)。
對於服務端限流,當觸發限流的時候,服務端一般會拒絕請求,並且可能返回 429 這個 http 狀態碼。客戶端是這個請求直接異常,還是快取起來之後繼續重試,取決於客戶端的策略。
每日一刷,輕鬆提公升技術,斬獲各種offer:
為什麼使用分布式系統
為什麼使用分布式系統,總結有以下幾個原因 1.我覺得最主要的是考慮到伺服器效能的問題。單台伺服器的效能畢竟有限,綜合利用多個節點的處理能力,才能提高整體的服務能力 2.分布式模組可以採用不同的解決方案。只要是滿足指定的是互動協議,各模組可以根據各自的業務特點,選擇不同的處理方式,如微軟的解決方案,也...
分布式為什麼使用Redis
在專案中使用 redis,主要考慮兩個角度 效能和併發。如果只是為了分布式鎖這些其他功能,還有其他中介軟體 zookpeer 等代替,並非一定要使用 redis。效能 如下圖所示,我們在碰到需要執行耗時特別久,且結果不頻繁變動的 sql,就特別適合將執行結果放入快取。這樣,後面的請求就去快取中讀取,...
什麼是分布式系統
一 什麼是分布式系統?1.所謂分布式,就是將乙個軟體或者是系統,看成乙個整體 不管多複雜 2.然後將這個整體拆分成若干個progress,每乙個progress都具備一定的功能 3.最後通過不同的協議,使每個progress都能夠互相通訊,連線起來。這個系統就是分布式系統。二 為什麼要這樣做?也就是...