日韩床上生活一级视频|能看毛片的操逼网站|色悠悠网站在线观看视频|国产免费观看A淫色免费|国产av久久久久久久|免费A级视频美女网站黄|国产毛片av日韩小黄片|热久久免费国产视频|中文字幕无码色色|成人在线视频99久久久

機(jī)電之家 > 機(jī)電號(hào) > 正文 申請(qǐng)入駐

博文精譯-斷路器模式

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

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

下面是ruby寫的一個(gè)簡(jiǎn)單示例,用于防止超時(shí)。

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

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

斷路器存儲(chǔ)block,初始化各種參數(shù)(閾值、超時(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,如果打開則返回錯(cuò)誤

# 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í),我們故障計(jì)數(shù)器計(jì)數(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ù)與閾值進(jìn)行比較,確定斷路器的狀態(tài)

class circuitbreaker...

def state

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

end

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

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

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)準(zhǔn)備好進(jìn)行試驗(yàn)性的真實(shí)調(diào)用,看看問(wèn)題是否已經(jīng)修復(fù)。

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)下的試驗(yàn)性調(diào)用,如果成功,將重置斷路器;如果失敗,將重啟超時(shí)設(shè)置。

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

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

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

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

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

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

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

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

致謝

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

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

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è)主營(yíng)產(chǎn)品/
/閱讀下一篇/

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

相關(guān)推薦
熱點(diǎn)推薦
水輪發(fā)電機(jī)組調(diào)速器油壓裝置自動(dòng)化控制系統(tǒng)概述

水輪發(fā)電機(jī)組調(diào)速器油壓裝置自動(dòng)化控制系統(tǒng)概述

成都國(guó)科自動(dòng)化控制工程有限公司
2025/11/24 9:46:29
深潛未來(lái),驅(qū)動(dòng)無(wú)限可能:深空創(chuàng)想科技水下伺服電機(jī)應(yīng)用全景解讀

深潛未來(lái),驅(qū)動(dòng)無(wú)限可能:深空創(chuàng)想科技水下伺服電機(jī)應(yīng)用全景解讀

深圳市深空創(chuàng)想科技有限公司
2025/11/18 10:22:27
智慧公寓新標(biāo)準(zhǔn):通通鎖App讓用水管理更高效、更透明

智慧公寓新標(biāo)準(zhǔn):通通鎖App讓用水管理更高效、更透明

浙江宏諾電氣科技有限公司
2025/11/15 15:34:20
一同探秘,如何通過(guò)材料選擇與預(yù)處理,鍛造出真空電機(jī)的“不壞之身”

一同探秘,如何通過(guò)材料選擇與預(yù)處理,鍛造出真空電機(jī)的“不壞之身”

深圳市深空創(chuàng)想科技有限公司
2025/11/14 10:20:03
充電樁引發(fā)力調(diào)電費(fèi)問(wèn)題的解決方案-空載直補(bǔ)

充電樁引發(fā)力調(diào)電費(fèi)問(wèn)題的解決方案-空載直補(bǔ)

杭州時(shí)域電子科技有限公司
2025/11/13 16:02:44
充電樁晝夜負(fù)載不均導(dǎo)致功率因數(shù)不達(dá)標(biāo)案例分享

充電樁晝夜負(fù)載不均導(dǎo)致功率因數(shù)不達(dá)標(biāo)案例分享

杭州時(shí)域電子科技有限公司
2025/11/13 16:00:46
了解MPP電力管在光伏發(fā)電系統(tǒng)的應(yīng)用優(yōu)勢(shì)

了解MPP電力管在光伏發(fā)電系統(tǒng)的應(yīng)用優(yōu)勢(shì)

江蘇潤(rùn)碩管業(yè)有限公司
2025/11/12 17:21:55
案例分析:無(wú)功補(bǔ)償控制器電容投滿功率因數(shù)還不達(dá)標(biāo)?

案例分析:無(wú)功補(bǔ)償控制器電容投滿功率因數(shù)還不達(dá)標(biāo)?

杭州時(shí)域電子科技有限公司
2025/11/12 8:57:46
功率因數(shù)PF與cosФ的區(qū)別

功率因數(shù)PF與cosФ的區(qū)別

杭州時(shí)域電子科技有限公司
2025/11/12 8:55:23
無(wú)功補(bǔ)償控制器投切的時(shí)間奧秘:延時(shí)、震蕩、放電一次講透!

無(wú)功補(bǔ)償控制器投切的時(shí)間奧秘:延時(shí)、震蕩、放電一次講透!

杭州時(shí)域電子科技有限公司
2025/11/12 8:53:55
諧波對(duì)功率因數(shù)有何影響?諧波影響下功率因數(shù)的補(bǔ)償上限設(shè)置問(wèn)題

諧波對(duì)功率因數(shù)有何影響?諧波影響下功率因數(shù)的補(bǔ)償上限設(shè)置問(wèn)題

杭州時(shí)域電子科技有限公司
2025/11/11 10:51:22
水電廠防水淹廠房監(jiān)測(cè)報(bào)警系統(tǒng)概述及構(gòu)成

水電廠防水淹廠房監(jiān)測(cè)報(bào)警系統(tǒng)概述及構(gòu)成

成都國(guó)科自動(dòng)化控制工程有限公司
2025/11/11 9:42:29
EOCR-DS3 產(chǎn)品在電梯行業(yè)的應(yīng)用

EOCR-DS3 產(chǎn)品在電梯行業(yè)的應(yīng)用

承德尚越電子科技有限公司
2025/11/7 15:56:37
征途向海,動(dòng)力永續(xù):專屬防水電機(jī)/水下伺服電機(jī),為特種應(yīng)用注入澎湃動(dòng)能

征途向海,動(dòng)力永續(xù):專屬防水電機(jī)/水下伺服電機(jī),為特種應(yīng)用注入澎湃動(dòng)能

深圳市深空創(chuàng)想科技有限公司
2025/11/3 9:44:19
賦能特殊環(huán)境,打破柔性革命:這款真空線纜為何是高端制造的“生命線”

賦能特殊環(huán)境,打破柔性革命:這款真空線纜為何是高端制造的“生命線”

深圳市深空創(chuàng)想科技有限公司
2025/11/1 14:20:07
161487文章數(shù) 921關(guān)注度
往期回顧 全部

電子相關(guān)熱點(diǎn)

汽車展廳的”能耗儀表盤“:Acrel-5000如何讓4S店用能數(shù)據(jù)”可視化“?

電子相關(guān)推薦

破局而立,告訴你真空線纜的三大核心特質(zhì)

頭條要聞

告別“糊涂賬”!產(chǎn)業(yè)園區(qū)水電收費(fèi)治理指南

電子要聞

顯控觸摸屏觸摸響應(yīng)慢(維修)注意細(xì)節(jié)

電子資訊

高真空線纜用在哪些地方,有什么特點(diǎn)

往期電子要聞

【智慧測(cè)控】水電站閘門遠(yuǎn)程自動(dòng)化控制系統(tǒng)解決方案概述