中華廚具網
    手機版    二維碼   標簽云  廚具企業大全

博文精譯-斷路器模式

2024-05-12 20:07:23 來源:網絡 作者/編輯: 瀏覽次數:4241 手機訪問 使用手機“掃一掃”以下二維碼,即可分享本文到“朋友圈”中。

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

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

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

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

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

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

class circuitbreaker...

attr_accessor :invocation_timeout, :failure_threshold, :monitor

def initialize &block

@circuit = block

@invocation_timeout = 0.01

@failure_threshold = 5

@monitor = acquire_monitor

reset

end

如果線路關閉,則調用斷路器將調用底層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

如果我們調用超時,我們故障計數器計數增加,調用成功則將其重置為零。

class circuitbreaker...

def record_failure

@failure_count += 1

@monitor.alert(:open_circuit) if :open == state

end

def reset

@failure_count = 0

@monitor.alert :reset_circuit

end

將故障失敗數與閾值進行比較,確定斷路器的狀態

class circuitbreaker...

def state

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

end

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

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

class resetcircuitbreaker...

def initialize &block

@circuit = block

@invocation_timeout = 0.01

@failure_threshold = 5

@monitor = breakermonitor.new

@reset_timeout = 0.1

reset

end

def reset

@failure_count = 0

@last_failure_time = nil

@monitor.alert :reset_circuit

end

現在出現了第三種狀態—半開放狀態—這意味著線路已經準備好進行試驗性的真實調用,看看問題是否已經修復。

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

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

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

@monitor.alert(:open_circuit) if :open == state

end

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

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

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

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

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

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

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

致謝

來源:網絡

以上是網絡信息轉載,信息真實性自行斟酌。

 
本條標題:博文精譯-斷路器模式
本條信息網址:
文本助手 資訊搜索 分享好友 打印本文 關閉窗口
閱讀關鍵詞
  • 手機瀏覽本文

    手機應用中掃描本文二維碼,即可瀏覽本文或分享到您的社交網絡中。

  • 微信公眾號

    掃描二維碼,關注中華廚具網微信公眾號,實時了解行業最新動態。

版權/免責聲明:
一、本文圖片及內容來自網絡,不代表本站的觀點和立場,如涉及各類版權問題請聯系及時刪除。
二、凡注明稿件來源的內容均為轉載稿或由企業用戶注冊發布,本網轉載出于傳遞更多信息的目的;如轉載稿涉及版權問題,請作者聯系我們,同時對于用戶評論等信息,本網并不意味著贊同其觀點或證實其內容的真實性。
三、轉載本站原創文章請注明來源:中華廚具網

0相關評論
今日熱點文章更多
品牌聚焦更多
推薦品牌更多
熱門頻道
關閉廣告
合作伙伴:
中華廚具網 魯ICP備2021046805號         魯公網安備 37162502000363號 (c)2018-2025SYSTEM All Rights Reserved 投資有風險 加盟需謹慎
關閉廣告
關閉廣告
无码八A片人妻少妇久久| 狠狠色丁香婷婷久久综合不卡| 91久久香蕉国产熟女线看| 久久亚洲欧美日本精品| 久久综合伊人77777| 亚洲精品美女久久久久99| 欧美激情精品久久久久| 国产成人综合久久精品红| 国产精品久久久久天天影视| 久久久久亚洲AV无码去区首| 久久久久亚洲av无码专区| 久久www免费人成精品香蕉| 亚洲精品乱码久久久久久蜜桃不卡 | 国产亚州精品女人久久久久久| 7777精品伊人久久久大香线蕉| 久久狠狠高潮亚洲精品| 亚洲欧美一级久久精品| 99精品伊人久久久大香线蕉| 久久久www免费人成精品| 国产高潮国产高潮久久久91| 无码伊人66久久大杳蕉网站谷歌 | 久久99精品国产99久久6| 久久精品无码午夜福利理论片| 青春久久| 久久久噜噜噜久久中文字幕色伊伊| 久久精品夜夜夜夜夜久久| 久久久国产99久久国产一| 久久精品国产精品亚洲人人| 91久久精一区二区三区大全| 亚洲日本va中文字幕久久| 久久亚洲精品国产亚洲老地址| 久久精品中文字幕有码| 国产L精品国产亚洲区久久| 热re99久久精品国产99热| 久久精品蜜芽亚洲国产AV| 久久男人Av资源网站无码软件| 思思久久好好热精品国产| 欧美日韩精品久久久免费观看| 性做久久久久久久久| 午夜精品久久久久久影视777| 久久久久国产视频电影|