限流,是對併發訪問進行限速,保護系統不會在過載的情況下出現問題
一般來說,觸發的限流行為如下
一般的做法,是當流量暴增的時候,將同一時間內發起請求數最多的客戶端請求全部丟棄。這種方法可以抵擋住惡意發起的高併發請求。
關閉或是把後端服務做降級處理,騰出資源處理更多的請求。
降級的方式有:
一般會使用乙個佇列來緩衝大量的請求,佇列如果滿了,那麼就只能拒絕使用者了。
動用自動化運維的方式對相應的服務做自動化的伸縮。需要乙個應用效能的監控系統,感知最繁忙的top服務,並通過自動化的發布、部署和服務註冊的運維系統去伸縮它們。如果是資料庫的壓力,那麼彈性伸縮應用是沒什麼用的
維護乙個計數器 counter,當乙個請求來時,就做加一操作,當乙個請求處理完後就做減一操作,來實現最簡單的限流演算法。這個 counter 大於某個數了(設定的限流閾值),那麼就開始拒絕請求以保護系統的負載了。
請求的速度可以是波動的,而處理的速度則是非常均速的,有點像乙個 fifo 的演算法。
優先順序的佇列
在上面這個 fifo 的佇列上加上優先順序,處理時先處理高優先順序的佇列,然後再處理低優先順序的佇列。只有高優先順序的佇列被處理完成後,才會處理低優先順序的佇列。
有個問題是: 如果高優先順序的佇列一直未處理完,那麼低優先順序的佇列的請求一直得不到處理。使用帶權重的佇列可以處理
帶權重的佇列
分配不同比例的處理時間到不同的佇列上。如下圖所示,有三個佇列的權重分布是 3:2:1。
佇列演算法需要用佇列長度來控制流量,在配置上比較難操作。佇列過長,佇列還未滿時後端已經受不住壓力掛掉了。
可參看限流演算法之漏桶演算法、令牌桶演算法
一般來說,這個「漏斗」是用乙個佇列來實現的,漏斗演算法其實就是在佇列請求中加上乙個限流器,強行限制資料的傳輸速率。
可參看限流演算法之漏桶演算法、令牌桶演算法
令牌桶演算法(token bucket)和 leaky bucket 效果一樣但方向相反的演算法,
系統會按恆定時間間隔往桶裡加入token(想象和漏洞漏水相反,有個水龍頭在不斷的加水),如果桶已經滿了就不再加了.新請求來臨時,會各自拿走乙個token,如果沒有token可拿了就阻塞或者拒絕服務.在流量小的時候「攢錢」,流量大的時候,可以快速處理。
上面的演算法有個不好的地方,就是需要設定乙個確定的限流值。而這個閾值不是那麼好確定的,需要做效能測試,找到系統最大的效能值。很多時候並不知道這個限流值,或是很難給出乙個合適的值。
很難設定限流值的原因
基於上述這些原因,限流的值是很難被靜態地設定成恆定的乙個值。使用一種動態限流的方式,不再設定乙個特定的流控值,而是能夠動態地感知系統的壓力來自動化地限流。這方面設計的典範是 tcp 協議的擁塞控制的演算法(可參看 、 。
分布式系統學習 17 彈力設計篇 降級設計
所謂的降級設計 degradation 本質是為了解決資源不足和訪問量過大的問題。當資源和訪問量出現矛盾的時候,在有限的資源下,為了能夠扛住大量的請求,需要對系統進行降級操作。暫時犧牲掉一些東西,以保障整個系統的平穩執行。犧牲哪些東西 降級之後,只能保證流程最終結果的一致性。會有兩種做法,一種是簡化...
分布式系統學習
分布式系統中節點分布情況在空間上是隨意分布的。系統中所有節點都是對等的,沒有主從之分。副本是分布式系統對資料和服務提供的一種冗餘方式,資料副本是指在不同節點上持久化同乙份資料,解決單點故障資料丟失的問題,服務副本是指多個節點提供同樣的服務,每個節點都有能力接受來自外部的請求並進行相應的處理。分布式系...
作業系統學習 分布式系統結構
分布式系統是一組不共享記憶體和時鐘的處理器的集合,即每個處理器都有它自己的記憶體,處理器之間的通訊可通過各種通訊網路加以實現。一 動機 建立分布式系統主要由4個方面的原因 1 資源共享 2 加快計算速度 3 可靠性 4 通訊 不同站點可以有機會交換資訊 二 分布式作業系統的型別 1 網路作業系統 通...