線上防雪崩利器——熔斷器設計原理與實現

前言

這是一篇根據工做中遇到的問題總結出的最佳實踐。redis

上週六,我負責的業務在凌晨00-04點的支付所有失敗了。sql

結果一查,MD,晚上銀行維護,下游支付系統沒有掛維護公告,在此期間一直請求維護中的銀行,固然全部返回就是失敗了,有種欲哭無淚的感受,鍋讓業務來背。架構

爲了杜絕在此出現這種大面積批量的支付失敗狀況發生,保障系統的健壯性。我須要個在集中性異常的時候能夠終止請求,當服務恢復,恢復請求。併發

我想了一些方式,最後,以爲熔斷器比較適合幹這種事情。分佈式

狀態模式

咱們已一個開關爲例高併發

 

 

在每一種狀態下,context沒必要關心每一種狀態下的行爲。交給每一種狀態本身處理。性能

熔斷器基本原理

熔斷器是當依賴的服務已經出現故障時,爲了保證自身服務的正常運行再也不訪問依賴的服務,防止雪崩效應學習

 

熔斷器自己就是一個狀態機。測試

關閉狀態:熔斷器的初始化狀態,該狀態下容許請求經過。當失敗超過閥值,轉入打開狀態spa

打開狀態:熔斷狀態,該狀態下不容許請求經過,當進入該狀態通過一段時間,進入半開狀態

半開狀態:在半開狀態期間,容許部分請求經過,在半開期間,觀察失敗狀態是否超過閥值。若是沒有超過進入關閉狀態,若是超過了進入關閉狀態。如此往復。

以前,查了一些資料,網上全部的資料幾乎都是針對Hystrix的。這個只是針對分佈式系統的接口請求,並不能運用於咱們的系統中,所以這種狀況下,根據原理本身實現了一個基本的分佈式熔斷器,數值與計數器存放在redis中,由於redis的操做客戶端不同,我就以本地熔斷器爲例,講解熔斷器實現。

但願個人文章能對於理解熔斷器,以及須要熔斷器的人有所幫助。

簡單的本地熔斷器實現

一個基本的本地熔斷器。

image.png

對外暴露接口

熔斷器對外暴露接口

 

熔斷器狀態對外暴露接口

 

三種狀態

關閉狀態實現:

 

 

打開狀態

 

半開狀態

 

 

熔斷器

抽象熔斷器

 

 

本地熔斷器

 

測試例子

 

 

結果

歡迎工做一到五年的Java工程師朋友們加入Java架構開發:744677563

羣內提供免費的Java架構學習資料(裏面有高可用、高併發、高性能及分佈式、Jvm性能調優、Spring源碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)合理利用本身每一分每一秒的時間來學習提高本身,不要再用"沒有時間「來掩飾本身思想上的懶惰!趁年輕,使勁拼,給將來的本身一個交代!

相關文章
相關標籤/搜索