線上防雪崩利器——熔斷器設計原理與實現
前言
這是一篇根據工作中遇到的問題總結出的最佳實踐。
上周六,我負責的業務在淩晨00-04點的支付全部失敗了。
結果一查,MD,晚上銀行維護,下遊支付系統沒有掛維護公告,在此期間一直請求維護中的銀行,當然所有返回就是失敗了,有種欲哭無淚的感覺,鍋讓業務來背。
為了杜絕在此出現這種大面積批量的支付失敗情況發生,保障系統的健壯性。我需要個在集中性異常的時候可以終止請求,當服務恢復,恢復請求。
我想了一些方式,最後,覺得熔斷器比較適合幹這種事情。
狀態模式
我們已一個開關為例
![技術分享圖片](https://upload-images.jianshu.io/upload_images/7564501-09d891a6ec50a4e1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/674/format/webp)
![技術分享圖片](https://upload-images.jianshu.io/upload_images/7564501-c9423a8998cebaa0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/671/format/webp)
在每一種狀態下,context不必關心每一種狀態下的行為。交給每一種狀態自己處理。
熔斷器基本原理
熔斷器是當依賴的服務已經出現故障時,為了保證自身服務的正常運行不再訪問依賴的服務,防止雪崩效應
熔斷器本身就是一個狀態機。
關閉狀態:熔斷器的初始化狀態,該狀態下允許請求通過。當失敗超過閥值,轉入打開狀態,
打開狀態:熔斷狀態,該狀態下不允許請求通過,當進入該狀態經過一段時間,進入半開狀態。
半開狀態:在半開狀態期間,允許部分請求通過,在半開期間,觀察失敗狀態是否超過閥值。如果沒有超過進入關閉狀態,如果超過了進入關閉狀態。如此往復。
之前,查了一些資料,網上所有的資料幾乎都是針對Hystrix的。這個只是針對分布式系統的接口請求,並不能運用於我們的系統中,因此這種情況下,根據原理自己實現了一個基本的分布式熔斷器,數值與計數器存放在redis中,因為redis的操作客戶端不一樣,我就以本地熔斷器為例,講解熔斷器實現。
希望我的文章能對於理解熔斷器,以及需要熔斷器的人有所幫助。
簡單的本地熔斷器實現
一個基本的本地熔斷器。
image.png
對外暴露接口
熔斷器對外暴露接口
![技術分享圖片](https://upload-images.jianshu.io/upload_images/7564501-7d92434964eca0d0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/673/format/webp)
熔斷器狀態對外暴露接口
![技術分享圖片](https://upload-images.jianshu.io/upload_images/7564501-af218eefc2af111f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/672/format/webp)
三種狀態
關閉狀態實現:
![技術分享圖片](https://upload-images.jianshu.io/upload_images/7564501-a070a787f419d248.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/672/format/webp)
![技術分享圖片](https://upload-images.jianshu.io/upload_images/7564501-ade1a95025cb2461.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/673/format/webp)
打開狀態
![技術分享圖片](https://upload-images.jianshu.io/upload_images/7564501-77f365d9e8fa628b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/673/format/webp)
半開狀態
![技術分享圖片](https://upload-images.jianshu.io/upload_images/7564501-0d672989cec51225.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/672/format/webp)
![技術分享圖片](https://upload-images.jianshu.io/upload_images/7564501-15d71c80e81ab50d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/672/format/webp)
熔斷器
抽象熔斷器
![技術分享圖片](https://upload-images.jianshu.io/upload_images/7564501-55f8ca41029135d9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/673/format/webp)
![技術分享圖片](https://upload-images.jianshu.io/upload_images/7564501-e159fca1a69aae64.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/673/format/webp)
本地熔斷器
![技術分享圖片](https://upload-images.jianshu.io/upload_images/7564501-8daf882a848b8060.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/666/format/webp)
測試例子
![技術分享圖片](https://upload-images.jianshu.io/upload_images/7564501-094c3ea0f049bed1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/671/format/webp)
![技術分享圖片](https://upload-images.jianshu.io/upload_images/7564501-fc16a34c9b2b71db.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/672/format/webp)
結果
![技術分享圖片](https://upload-images.jianshu.io/upload_images/7564501-2bb86f30c1f29c63.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1000/format/webp)
線上防雪崩利器——熔斷器設計原理與實現