1. 熔斷
1.1 熔斷來源
我們家用電閘上都有保險絲模塊,當電壓出現短路問題時,自動跳閘,此刻電路主動斷開,我們的電器就會收到保護。否則,不能斷開,后果不堪設想。
保險絲就是一個自我保護裝置,保護整個電路。
1.2 分布式系統中的熔斷
在分布式系統中,我們往往需要依賴下游服務,不管是內部系統還是第三方服務,如果下游出現問題,我們還是盲目地去請求,及時失敗了多次,還是傻傻的去請求,去等待。
這樣,
一是增加了整個鏈路的請求時間
第二,下游系統本身就出現了問題,不斷的請求又把系統問題加重了,恢復困難。
1.3 熔斷的作用
熔斷模式可以防止應用程序不斷地嘗試可能超時和失敗的服務,能達到應用程序執行而不必等待下游服務修正錯誤服務。
熔斷器模式最牛的是能讓應用程序自我診斷下游系統的錯誤是否已經修正,如果沒有,不放量去請求,如果請求成功了,慢慢的增加請求,再次嘗試調用。
1.4 像不像代理模式?
熔斷器模式像那些,容易導致錯誤操作的,一種代理
這種代理能夠記錄調用發生的錯誤次數,並根據次數,自我決定是否繼續調用還是立刻返回錯誤。
比如說A服務調用B服務,B服務是下游的服務提供,或者是第三方服務,容易發生問題。這樣既能防止不斷的調用,是下游服務更壞,保護了下游方,還能降低自己的執行成本,快速的響應,減少延遲,增加吞吐量。
業內目前流行的熔斷器很多,例如阿里出的Sentinel,以及最多人使用的Hystrix。
2. 降級
2.1 降級的本質
降級就是為了解決資源不足和訪問量增加的矛盾
在有限的資源情況下,為了能抗住大量的請求,就需要對系統做出一些犧牲,有點“棄卒保帥”的意思。放棄一些功能,保證整個系統能平穩運行
2.2 降級犧牲的是什么?
強強一致性變成最終一致性
大多數的系統是不需要強一致性的。
強一致性就要求多種資源的占用,減少強一致性就能釋放更多資源
這也是我們一般利用消息中間件來削峰填谷,變強一致性為最終一致性,也能達到效果
干掉一些次要功能
停止訪問不重要的功能,從而釋放出更多的資源
舉例來說,比如電商網站,評論功能流量大的時候就能停掉,當然能不直接干掉就別直接,最好能簡化流程或者限流最好
簡化功能流程。把一些功能簡化掉
2.3 降級的注意點
對業務進行仔細的梳理和分析
哪些是核心流程必須保證的,哪些是可以犧牲的
什么指標下能進行降級
吞吐量、響應時間、失敗次數等達到一個閾值才進行降級處理
如何降級
降級最簡單的就是在業務代碼中配置一個開關或者做成配置中心模式,直接在配置中心上更改配置,推送到相應的服務。
3. 限流
3.1 限流的目的
通過對並發訪問進行限速。
3.2 限流有哪些行為
拒絕服務
最簡單的方式,把多余的請求直接拒絕掉
做的高大上一些,可以根據一定的用戶規則進行拒絕策略。
服務降級
降級甚至關掉后台的某些服務。
特權請求
在多租戶或者對用戶進行分級時,可以考慮讓一些特殊的用戶有限處理,其他的可以考慮干掉
延時處理
可以利用隊列把請求緩存住。削峰填谷。
3.3 限流的實現方式
計數器
最簡單的實現方式 ,維護一個計數器,來一個請求計數加一,達到閾值時,直接拒絕請求。
一般實踐中用 ngnix + lua + redis 這種方式,redis 存計數值
漏斗模式
流量就像進入漏斗中的水一樣,而出去的水和我們系統處理的請求一樣,當流量大於漏斗的流出速度,就會出現積水,水對了會溢出。
漏斗很多是用一個隊列實現的,當流量過多時,隊列會出現積壓,隊列滿了,則開始拒絕請求。
令牌桶
看圖例,令牌通和漏斗模式很像,主要的區別是增加了一個中間人,這個中間人按照一定的速率放入一些token,然后,處理請求時,需要先拿到token才能處理,如果桶里沒有token可以獲取,則不進行處理。
3.4 限流的一些注意點
限流越早設計約好,架構成型后,不容易加入
限流模塊不要成為系統的瓶頸,性能要求高
最好有個開關,可以直接介入
限流發生時,能及時發出通知事件
限流發生時,給用戶提供友好的提示 。
4. 三者的關系
熔斷強調的是服務之間的調用能實現自我恢復的狀態;
限流是從系統的流量入口考慮,從進入的流量上進行限制,達到保護系統的作用;
降級,是從系統內部的平級服務或者業務的維度考慮,流量大了,可以干掉一些,保護其他正常使用;
熔斷是降級方式的一種;
降級又是限流的一種方式;
三者都是為了通過一定的方式去保護流量過大時,保護系統的手段。