自在自线亚洲а∨天堂在线-中文字幕一区视频播放-扒开双腿猛进入喷水高潮叫声-欧美日本亚洲一区二区-老熟妇高潮偷拍一区二区-国产精品高清一区二区不卡-午夜色福利视频一区二区三区-亚洲国产成人精品福利在线观看-亚洲欧美成人一区二区在线电影

機電之家 > 機電號 > 正文 申請入駐

博文精譯-斷路器模式

軟件系統(tǒng)對運行在不同進程或者網(wǎng)路中不同的機器的軟件進行遠程調(diào)用是很常見的。內(nèi)存中調(diào)用和遠程調(diào)用之間的一個主要區(qū)別是,遠程調(diào)用可能會失敗,或者在達到某個超時限制之前掛起而沒有響應。更糟糕的是,如果一個響應延遲的服務提供方上有許多調(diào)用者,那么您可能會耗盡關(guān)鍵資源,導致跨多個系統(tǒng)的連鎖故障。michael nygard在他的優(yōu)秀著作《發(fā)布》中推廣了斷路器模式,以防止這種災難性的連鎖故障。

斷路器的基本原理很簡單。您將一個受保護的函數(shù)調(diào)用封裝在一個斷路器對象中,該斷路器對象監(jiān)視故障。一旦故障達到某個閾值,斷路器就會跳閘,所有對斷路器的繼續(xù)調(diào)用都會返回一個錯誤,受保護的調(diào)用也不會繼續(xù)。如果斷路器跳閘,您通常還需要通過監(jiān)視器進行警報。

下面是ruby寫的一個簡單示例,用于防止超時。

我使用block (lambda)設置了斷路器,它是受保護的調(diào)用。

cb = circuitbreaker.new {|arg| @supplier.func arg}

斷路器存儲block,初始化各種參數(shù)(閾值、超時和監(jiān)視功能),并將斷路器重置為關(guān)閉狀態(tài)。

class circuitbreaker...

attr_accessor :invocation_timeout, :failure_threshold, :monitor

def initialize &block

@circuit = block

@invocation_timeout = 0.01

@failure_threshold = 5

@m(xù)onitor = acquire_monitor

reset

end

如果線路關(guān)閉,則調(diào)用斷路器將調(diào)用底層block,如果打開則返回錯誤

# client code

acircuitbreaker.call(5)

class circuitbreaker...

def call args

case state

when :closed

begin

do_call args

rescue timeout::error

record_failure

raise $!

end

when :open then raise circuitbreaker::open

else raise "unreachable code"

end

end

def do_call args

result = timeout::timeout(@invocation_timeout) do

@circuit.call args

end

reset

return result

end

如果我們調(diào)用超時,我們故障計數(shù)器計數(shù)增加,調(diào)用成功則將其重置為零。

class circuitbreaker...

def record_failure

@failure_count += 1

@m(xù)onitor.a(chǎn)lert(:open_circuit) if :open == state

end

def reset

@failure_count = 0

@m(xù)onitor.a(chǎn)lert :reset_circuit

end

將故障失敗數(shù)與閾值進行比較,確定斷路器的狀態(tài)

class circuitbreaker...

def state

(@failure_count >= @failure_threshold) ? :open : :closed

end

這個簡單的斷路器避免了在電路打開時進行調(diào)用,但是當一切恢復正常時需要外部干預來重置它。對于建筑物中的斷路器,這是一種合理的方法,但是對于軟件中斷路器,我們可以讓斷路器本身檢測底層調(diào)用是否可以繼續(xù)。我們可以通過在適當?shù)拈g隔之后再次嘗試被保護調(diào)用來實現(xiàn)這種自重置行為,成功時則重置斷路器。

創(chuàng)建這種斷路器意味著需要為重置嘗試添加一個閾值,并設置一個變量來保存上次錯誤時間。

class resetcircuitbreaker...

def initialize &block

@circuit = block

@invocation_timeout = 0.01

@failure_threshold = 5

@m(xù)onitor = breakermonitor.new

@reset_timeout = 0.1

reset

end

def reset

@failure_count = 0

@last_failure_time = nil

@m(xù)onitor.a(chǎn)lert :reset_circuit

end

現(xiàn)在出現(xiàn)了第三種狀態(tài)—半開放狀態(tài)—這意味著線路已經(jīng)準備好進行試驗性的真實調(diào)用,看看問題是否已經(jīng)修復。

class resetcircuitbreaker...

def state

case

when (@failure_count >= @failure_threshold) &&

(time.now - @last_failure_time) > @reset_timeout

:half_open

when (@failure_count >= @failure_threshold)

:open

else

:closed

end

end

在半打開狀態(tài)下的試驗性調(diào)用,如果成功,將重置斷路器;如果失敗,將重啟超時設置。

class resetcircuitbreaker...

def call args

case state

when :closed, :half_open

begin

do_call args

rescue timeout::error

record_failure

raise $!

end

when :open

raise circuitbreaker::open

else

raise "unreachable"

end

end

def record_failure

@failure_count += 1

@last_failure_time = time.now

@m(xù)onitor.a(chǎn)lert(:open_circuit) if :open == state

end

這個例子很簡單,在實踐中斷路器提供了更多的特性和參數(shù)化設置。它們通常會防止受保護調(diào)用可能引發(fā)的一系列錯誤,比如網(wǎng)絡連接失敗。并不是所有的錯誤都應該跳閘,有些是反映正常的故障,需要作為常規(guī)邏輯的一部分進行處理。

由于流量很大,您可能會遇到大量調(diào)用等待超時的問題。由于遠程調(diào)用通常很慢,所以最好將每個調(diào)用放在不同的線程上,使用future或promise來處理返回的結(jié)果。從線程池中提取這些線程,在線程池耗盡時安排線路斷開。

這個例子展示了一種簡單的方法來跳閘—在成功調(diào)用時重置計數(shù)。一種更復雜的方法可能是查看錯誤的頻率,比如,一旦達到50%的失敗率,就會跳閘。您還可以為不同的錯誤設置不同的閾值,例如超時閾值為10,連接失敗閾值為3。

我所展示的示例是用于同步調(diào)用的斷路器,但是斷路器對于異步通信也很有用。這里的一種常見技術(shù)是將所有請求放在一個隊列中,服務提供者以一定速度消費該隊列—這是一種避免服務器過載的有用技術(shù)。在這種情況下,當隊列被填滿時,線路就會斷開。

就其本身而言,斷路器有助于減少在可能失敗的操作中占用資源。您可以避免客戶端的超時等待,而斷開的線路也可以避免給處于困境的服務器增加負載。我在這里討論的是遠程調(diào)用,這是使用斷路器的常見情況,但是它們可以用于任何需要保護系統(tǒng)部件免受其他部件故障影響的情況。

斷路器是一個有價值的監(jiān)測點。斷路器中狀態(tài)的任何更改都應該被記錄,斷路器應該顯示其狀態(tài)的詳細信息,以便進行更深入的監(jiān)控。斷路器的行為通常是一個很好的來源,來警告環(huán)境中更深層次的問題。操作人員應該能夠跳閘或復位斷路器。

斷路器本身是有價值的,但使用斷路器的客戶端需要對斷路器故障做出反應。與任何遠程調(diào)用一樣,您需要考慮在發(fā)生故障時應該做什么。它是否會使你正在進行的操作失敗,或者是否還有其他的解決辦法?比如信用卡授權(quán)可以放在隊列中稍后處理;通過顯示一些可以接受的舊數(shù)據(jù)來緩解無法獲取某些數(shù)據(jù)的問題。

致謝

pavel shpak在示例代碼中發(fā)現(xiàn)報告了一個bug

特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺“機電號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of JDZJ Hao, which is a social media platform and only provides information storage services.

/企業(yè)主營產(chǎn)品/
/閱讀下一篇/

智能斷路器:智慧用電,安全節(jié)能,打造智慧

相關(guān)推薦
熱點推薦
合金電阻選型技術(shù)分析-順??萍?>
                                        </div>
                                    </a>
                                    <h3>
                                        <a href=深圳市順??萍加邢薰?/span>
2026/3/20 17:12:43
服務器用電源HCA3500TF行業(yè)應用解析

服務器用電源HCA3500TF行業(yè)應用解析

西安浩南電子科技有限公司
2026/3/20 12:29:02
建設網(wǎng)絡營銷實訓室的必要性

建設網(wǎng)絡營銷實訓室的必要性

xianqunzhuo
2026/3/20 11:50:29
喜訊!南京英銳祺科技榮獲國家級專精特新 “小巨人”企業(yè)稱號

喜訊!南京英銳祺科技榮獲國家級專精特新 “小巨人”企業(yè)稱號

南京英銳祺科技有限公司
2026/3/18 11:09:26
主動式橋梁防撞預警系統(tǒng)工程案例匯總展示

主動式橋梁防撞預警系統(tǒng)工程案例匯總展示

廣州市上賽交通科技有限公司,東莞帝工智能
2026/3/16 11:17:43
DPG750功率因數(shù)矯正模塊的核心價值

DPG750功率因數(shù)矯正模塊的核心價值

西安浩南電子科技有限公司
2026/3/15 12:51:16
鐵路設備的可靠電力轉(zhuǎn)換方案--AUTRONIC電源

鐵路設備的可靠電力轉(zhuǎn)換方案--AUTRONIC電源

西安浩南電子科技有限公司
2026/3/15 12:48:46
ARCH開關(guān)電源AQF240E系列自動化設備應用案例

ARCH開關(guān)電源AQF240E系列自動化設備應用案例

西安浩南電子科技有限公司
2026/3/15 12:46:02
防爆弱電布線施工模塊、水晶頭壓制技術(shù)標準

防爆弱電布線施工模塊、水晶頭壓制技術(shù)標準

弱電智能化設計,施工,安裝,調(diào)試,維護
2026/3/12 16:07:10
超六類線是光纜嗎

超六類線是光纜嗎

遼寧津達線纜有限公司
2026/3/10 11:35:10
低速離心機的分類方法及保養(yǎng)維修規(guī)范

低速離心機的分類方法及保養(yǎng)維修規(guī)范

上海隱智科學儀器有限公司
2026/3/10 10:03:49
恒溫搖床的維護及故障解決方法

恒溫搖床的維護及故障解決方法

上海隱智科學儀器有限公司
2026/3/10 9:38:08
氣相色譜儀點火不正常的原因及解決方法

氣相色譜儀點火不正常的原因及解決方法

上海隱智科學儀器有限公司
2026/3/9 9:18:48
ABB	貝利電纜常見型號

ABB 貝利電纜常見型號

武漢禹力自動化科技有限公司
2026/3/6 9:05:17
模具抽真空機:用好設備,關(guān)鍵在廠家經(jīng)驗與成熟案例

模具抽真空機:用好設備,關(guān)鍵在廠家經(jīng)驗與成熟案例

上海力瀚自動化科技有限公司
2026/3/3 13:08:19
165855文章數(shù) 935關(guān)注度
往期回顧 全部

電子相關(guān)熱點

如何區(qū)分新料MPP電力管與再生料電力管

電子相關(guān)推薦

上海北弗電氣電機保護開關(guān)保護器介紹分析

頭條要聞

電壓擊穿試驗儀安全操作規(guī)程

電子要聞

2026年柔性電纜發(fā)展前景

電子資訊

奧科預包裝高硅鑄鐵陽極:長效防腐工程創(chuàng)新

往期電子要聞

原材料價格異動緊急通知:銅價單月飆升8000元/噸,滑觸線行業(yè)面臨價格調(diào)整壓力