限流、熔斷與降級

{"type":"doc","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"限流、熔斷與降級","attrs":{}}]},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"限流、熔斷與降級,此三者都是流量過大時,通過一定的方式去保護系統的手段,是應對海量服務的三大“神器”","attrs":{}}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/08/088126c482222e24f36056937e80ebe3.png","alt":null,"title":"","style":[{"key":"width","value":"100%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如上圖所述中ServiceA是主調,有兩個實例A1和A2。ServiceB是被調,也有兩個實例B1和B2。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"限流:一般是在被調生效,即圖中的綠色框框所處的位置","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"熔斷:一般是在主調生效,也有一部分熔斷設計是在被調生效的,如圖中紅色塊所處的位置。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"降級:一般的視角是從用戶側觀察,所享有的服務變差了。限流和熔斷都會帶來降級。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"1. 限流","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"限流是從系統的流量入口考慮,從進入的流量上進行限制,達到保護系統的作用","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"是指需要限制併發/請求量的場景(如秒殺等),通過限流保護服務免受雪崩之災。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"主流的限流算法有:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","text":"1.1 計數器","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"多少次每秒/每分/每天,根據作用範圍的不同,計算器可以分爲單機計數器即Local Counter(每個機器都有自己的計數器)和全局計數器也就是分佈式計數器即Global Counter(所有機器公有一個計數器閾值)","attrs":{}}]},{"type":"bulletedlist","content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"單機計數器一般會用自研計數服務(一般是本地有agent)或者memcache來做","attrs":{}}]}],"attrs":{}},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"分佈式計數器一般會用自研計數服務或者redis等組件來做","attrs":{}}]}],"attrs":{}}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"大公司一般都有自己的限流組件(已經包括了單機和分佈式計數器功能)","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","text":"1.2 令牌桶","attrs":{}}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/74/74610b6b37a83c822612fcd85594840f.png","alt":null,"title":"","style":[{"key":"width","value":"100%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"令牌桶算法是網絡流量整形(Traffic Shaping)和速率限制(Rate Limiting)中最常使用的一種算法。典型情況下,令牌桶算法用來控制發送到網絡上的數據的數目,並允許突發數據的發送。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"令牌桶算法的原理是系統會以一個恆定的速度往桶裏放入令牌,而如果請求需要被處理,則需要先從桶裏獲取一個令牌,當桶裏沒有令牌可取時,則拒絕服務。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","text":"1.3 漏桶","attrs":{}}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/98/982b720ac34aa73b3d5bf033d5333d07.png","alt":null,"title":"","style":[{"key":"width","value":"100%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"漏桶算法思路很簡單,水(請求)先進入到漏桶裏,漏桶以一定的速度出水,當水流入速度過大會直接溢出,可以看出漏桶算法能強行限制數據的傳輸速率。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"一般限流需要配合","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"壓測","attrs":{}}],"attrs":{}},{"type":"text","text":"來做,不然也不知道系統的負載極限在哪裏。初期的做法是通過單一服務的壓測或者全鏈路壓測得到一個閾值(靜態),該處做法就是簡單,缺點是隨着業務複雜度的上升靜態閾值不能代表服務的真實服務能力,所以一般在活動或者大促前會組織一批壓測。更好的做法是全鏈路壓測日常化,然後隨時來調整這個閾值。實現閾值從靜態到動態的轉變。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"下面比較下限流的三種方法的區別","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"|方法|優點|缺點|","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"|-|-|-|-|-|","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"|計數器|簡單方便|存在一下子被刷完計數器的情況|","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"|令牌桶|可以處理瞬間突發的流量|~|","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"|漏桶|限制請求的平均速率|不能處理瞬間流量的情況,當流量把漏桶裝滿後,大部分的請求都會被丟棄掉|","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"2. 熔斷","attrs":{}}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/1d/1d83caf42fe18072f9515b196b37eb77.png","alt":null,"title":"","style":[{"key":"width","value":"100%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如上圖所示,熔斷器首先是關閉的,當主調失敗到達了一定閾值後,此時熔斷器打開(主調的請求不會再到被調了,壓根就不會發出請求),過了一個\"冷卻時間\"後,熔斷器此時會處於一個半開的狀態,會有請求到被調,如果請求成功就關閉熔斷器(後端服務恢復),否則就繼續打開熔斷器。熔斷強調的是服務之間的調用能實現自我恢復的狀態。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"例如你的A服務裏面的一個功能依賴B服務,這時候B服務出問題了,返回的很慢。這種情況可能會因爲這麼一個功能而拖慢了A服務裏面的所有功能,因此我們這時候就需要熔斷!即當發現A要調用這B時就直接返回錯誤(或者返回其他默認值),就","attrs":{}},{"type":"codeinline","content":[{"type":"text","text":"不去請求B","attrs":{}}],"attrs":{}},{"type":"text","text":"了","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","text":"2.1 主調熔斷","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"主調熔斷是熔斷的主要場景,在微服務中是結合服務註冊和發現組件來使用的。主調通過服務發現組件來獲取被調的實例,如果主調的失敗達到了一個閾值,服務發現組件會熔斷被調的實例。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","text":"2.2 被調熔斷","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"被調熔斷,被調實例獲取當前的實例負載情況,如果cpu/內存/io等超過了一定的閾值,那麼就會觸發熔斷,將拋棄進來的請求。此時熔斷和限流比較像,一個是基於負載情況,一個是根據配置的閾值情況。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"3. 降級","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"降級,是從系統內部的平級服務或者業務的維度考慮,流量大了,可以幹掉一些,保護其他功能正常使用。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"降級也就是服務降級,當我們的服務器壓力劇增爲了保證核心功能的可用性 ,而選擇性的降低一些功能的可用性,或者直接關閉該功能。這就是典型的丟車保帥了。當服務暫時不可用或者影響到核心流程時,需要待高峯或者問題解決後再打開。通過降級實現部分可用、有損服務。主流的降級策略有基於RT(響應時間)、異常比率和異常數的降級。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"就比如貼吧類型的網站,當服務器喫不消的時候,可以選擇把發帖功能關閉,註冊功能關閉,改密碼,改頭像這些都關了,爲了確保登錄和瀏覽帖子這種核心的功能。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"codeinline","content":[{"type":"text","text":"降級的手段大致有這麼三種","attrs":{}}],"attrs":{}}]},{"type":"numberedlist","attrs":{"start":"1","normalizeStart":1},"content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":1,"align":null,"origin":null},"content":[{"type":"text","text":"`強一致變爲最後一致,延遲服務","attrs":{}}]}],"attrs":{}},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":2,"align":null,"origin":null},"content":[{"type":"text","text":"幹掉一些次要功能","attrs":{}}]}],"attrs":{}},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":3,"align":null,"origin":null},"content":[{"type":"text","text":"簡化流程","attrs":{}}]}],"attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"每個服務都需要制定自己的降級策略,根據服務不同的優先級來設定降級方案。另外降級策略最好是由開關係統或者配置系統統一控制。一般而言都會建立一個獨立的降級系統,可以靈活且批量的配置服務器的降級功能。當然也有用代碼自動降級的,例如接口超時降級、失敗重試多次降級等。具體失敗幾次,超時設置多久,由你們的業務等其他因素決定。開個小會,定個值,扔線上去看看情況。根據情況再調優。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"綜述","attrs":{}}]},{"type":"bulletedlist","content":[{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"觸發原因不太一樣,服務熔斷一般是某個服務(下游服務)故障引起,而服務降級一般是從整體負荷考慮;","attrs":{}}]}],"attrs":{}},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"管理目標的層次不太一樣,熔斷其實是一個框架級的處理,每個微服務都需要(無層級之分),而降級一般需要對業務有層級之分(比如降級一般是從最外圍服務開始)","attrs":{}}]}],"attrs":{}},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"限流是持續性的服務,邏輯一般在服務端。此時客戶端請求到達了服務端,但是服務端根據規則進行了限制(比如直接報頻率限制錯)。1分鐘限額10000的話,如果前50秒來了1萬,那麼後10的請求都會直接返回。整體來看服務端的服務是持續的","attrs":{}}]}],"attrs":{}},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"熔斷是非持續性的服務,邏輯一般在客戶端。此時客戶端的請求並沒有到服務端。當客戶端調用北極星獲取後端的服務出現比較多的錯誤的時候(錯誤數或者錯誤率超過一定的閾值),北極星會將該節點熔斷。一段時間客戶端的服務請求都不會到達服務端,所以服務端的服務看起來是不連續的。","attrs":{}}]}],"attrs":{}},{"type":"listitem","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"降級是從整體資源使用的角度來考慮的,實質是解決資源不足和訪問增加的情況。當整體資源不夠的時候,可以犧牲低優先級服務的體驗來保證高優先級服務的使用體驗。","attrs":{}}]}],"attrs":{}}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"codeinline","content":[{"type":"text","text":"熔斷和限流都可以認爲是降級的一種方式","attrs":{}}],"attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":3}}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章