分布式系統具備的保護機制?
分布式系統服務保護一、熔斷
熔斷一般是指依賴的外部接口出現故障的時斷絕和外部接口的關系;例如你的A服務里面的一個功能依賴B服務,這時候B服務出問題了,返回的很慢。這種情況可能會因為這么一個功能而拖慢了A服務里面的所有功能,因此我們這時候就需要熔斷!即當發現A要調用這B時就直接返回錯誤(或者返回其他默認值啊啥的),就不去請求B了。
雪崩效應:在微服務架構中,微服務是完成一個單一的業務功能,這樣做的好處是可以做到解耦,每個微服務可以獨立演進。但是,一個應用可能會有多個微服務組成,微服務之間的數據交互通過遠程過程調用完成。這就帶來一個問題,假設微服務A調用微服務B和微服務C,微服務B和微服務C又調用其它的微服務,這就是所謂的“扇出”。如果扇出的鏈路上某個微服務的調用響應時間過長或者不可用,對微服務A的調用就會占用越來越多的系統資源,進而引起系統崩潰,所謂的“雪崩效應”。
熔斷機制是應對雪崩效應的一種微服務鏈路保護機制。在微服務架構中,當扇出鏈路的某個微服務不可用或者響應時間太長時,會進行服務的降級,進而熔斷該節點微服務的調用,快速返回錯誤的響應信息。當檢測到該節點微服務調用響應正常后,恢復調用鏈路。
二、降級
降級也就是服務降級,當我們的服務器壓力劇增為了保證核心功能的可用性 ,而選擇性的降低一些功能的可用性,或者直接關閉該功能。這就是典型的丟車保帥了。就比如貼吧類型的網站,當服務器吃不消的時候,可以選擇把發帖功能關閉,注冊功能關閉,改密碼,改頭像這些都關了,為了確保登錄和瀏覽帖子這種核心的功能。
熔斷與降級的區別:觸發原因不太一樣,服務熔斷一般是某個服務(下游服務)故障引起,而服務降級一般是從整體負荷考慮;
三、限流
限流的目的是通過對并發訪問/請求進行限速或者一個時間窗口內的的請求進行限速來保護系統,一旦達到限制速率則可以拒絕服務(定向到錯誤頁或告知資源沒有了)、排隊或等待(比如秒殺、評論、下單)、降級(返回兜底數據或默認數據,如商品詳情頁庫存默認有貨)。
漏桶算法:漏桶算法思路是請求先進入到漏桶里,漏桶以一定的速度出水,當水流入速度過大會直接溢出,可以看出漏桶算法能強行限制數據的傳輸速率。
?
令牌桶算法:令牌桶算法的原理是系統會以一個恒定的速度往桶里放入令牌,而如果請求需要被處理,則需要先從桶里獲取一個令牌,當桶里沒有令牌可取時,則拒絕服務。相比于漏桶算法令牌桶的優點是可以改變放令牌的速度. 一旦需要提高速率,則按需提高放入桶中的令牌的速率. 一般會定時(比如100毫秒)往桶中增加一定數量的令牌, 有些變種算法則實時的計算應該增加的令牌的數量。Guava的RateLimiter就是采用該算法進行限流控制。
?
計數器算法:計數器算法的核心就是在規定的時間內限制請求次數;例如:對于A接口來說,我們1分鐘的訪問次數不能超過100個。在一開 始的時候,我們可以設置一個計數器counte=0,每當一個請求過來的時候,counter就加1,如果counter的值大于100并且該請求與第一個 請求的間隔時間還在1分鐘之內,那么說明請求數過多,拒絕請求;如果該請求與第一個請求的間隔時間大于1分鐘,且counter的值還在限流范圍內,那么就重置 counter=0;
?
Semaphore限流:可以控制某個資源可被同時訪問的個數,acquire()獲取一個許可,如果沒有就等待,而release()釋放一個許可。
四、常用的web服務器
Nginx主要有兩種限流方式:
按連接數限流(ngx_http_limit_conn_module)(令牌算法實現)
按請求速率限流(ngx_http_limit_req_module)(漏桶算法實現)
tomcat 通過以下三個配置參數來進行限流操作:
maxThreads(最大線程數):每一次HTTP請求到達Web服務,tomcat都會創建一個線程來處理該請求,那么最大線程數決定了Web服務可以同時處理多少個請求,默認200.
accepCount(最大等待數):當調用Web服務的HTTP請求數達到tomcat的最大線程數時,還有新的HTTP請求到來,這時tomcat會將該請求放在等待隊列中,這個acceptCount就是指能夠接受的最大等待數,默認100.如果等待隊列也被放滿了,這個時候再來新的請求就會被tomcat拒絕(connection refused)。
maxConnections(最大連接數):這個參數是指在同一時間,tomcat能夠接受的最大連接數。一般這個值要大于maxThreads+acceptCount。
在實際工作中對于流量入口的限流一般都是采用Nginx,tomcat一般會設置為適合當前操作系統的最大連接數,具體的業務限流(某個服務接口)一般使用sentinel和hystrix。
五、hystrix
提供了線程池隔離(默認)與信號量隔離
六、sentinel
古之學者為己,今之學者為人
分類: 中間件
標簽: 分布式