1. 程式人生 > >線上防雪崩利器——熔斷器設計原理與實現

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

data 沒有 保障系統 狀態模式 熔斷器 data- 雪崩 form cimage

前言

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

上周六,我負責的業務在淩晨00-04點的支付全部失敗了。

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

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

我想了一些方式,最後,覺得熔斷器比較適合幹這種事情。

狀態模式

我們已一個開關為例

技術分享圖片

技術分享圖片

在每一種狀態下,context不必關心每一種狀態下的行為。交給每一種狀態自己處理。

熔斷器基本原理

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

技術分享圖片

熔斷器本身就是一個狀態機。

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

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

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

之前,查了一些資料,網上所有的資料幾乎都是針對Hystrix的。這個只是針對分布式系統的接口請求,並不能運用於我們的系統中,因此這種情況下,根據原理自己實現了一個基本的分布式熔斷器,數值與計數器存放在redis中,因為redis的操作客戶端不一樣,我就以本地熔斷器為例,講解熔斷器實現。

希望我的文章能對於理解熔斷器,以及需要熔斷器的人有所幫助。

簡單的本地熔斷器實現

一個基本的本地熔斷器。

技術分享圖片

image.png

對外暴露接口

熔斷器對外暴露接口

技術分享圖片

熔斷器狀態對外暴露接口

技術分享圖片

三種狀態

關閉狀態實現:

技術分享圖片

技術分享圖片

打開狀態

技術分享圖片

半開狀態

技術分享圖片

技術分享圖片

熔斷器

抽象熔斷器

技術分享圖片

技術分享圖片

本地熔斷器

技術分享圖片

測試例子

技術分享圖片

技術分享圖片

結果

技術分享圖片

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