熔斷檢測機制
(1)請求call到backend后,首先判斷熔斷開關是否打開
(2)如果熔斷開關已打開,則表明當前請求不能被處理
(3)如果熔斷開關未打開,則判斷時間窗口(判斷統計錯誤率)是否已滿
(4)如果時間窗口(判斷統計錯誤率)未滿,則請求桶(redis) 中的請求數加1
(5)如果返回的response 有異常,則失敗桶(redis) 的失敗數加1,如果返回的response沒有異常,則成功桶(redis) 的成功數加1
(6)如果時間窗口(判斷統計錯誤率)已滿,則開始判斷是否需要熔斷
熔斷算法
充要條件:
(1)請求總數 > 設定值X
(2)失敗率 > 設定值Y
請求總數可以從請求桶redis 中獲取到
失敗率 = 失敗數 ÷ 請求數 × 100%
當請求總數大於一定值,且失敗率大於一定值時,則表示請求失敗數太多了,需要熔斷API請求
統計失敗率的時間窗口
(1)每次請求,都會判斷時間窗口是否已滿(如5分鍾),如果時間窗口已滿,則重新開始計時,且清理請求數/成功數/失敗數
(2)第一次開始的起始時間默認為當前時間。
熔斷持續時間
(1)如果出現問題,可以將所有請求鏈路熔斷掉,熔斷恢復時間可以假定為1分鍾,可以根據不同的環境進行調整
(2)熔斷恢復時間沒有根據環境來進行動態調整,比如網絡差的時候,持續了很長時間網絡都很差,這個時候,可以動態遞增熔斷時間
手動熔斷
因為熔斷是通過統計單位時間內的失敗率來判斷是否需要熔斷的,而有時候我們需要快速切斷請求鏈路,比如充值請求量太大的時候,導致很多訂單都被退款,這個時候我們可以先熔斷獲取套餐接口,這樣用戶就拿不到套餐,就不能充值了。
總熔斷檢測開關
有時候我們不需要熔斷檢測,這個時候我們就需要一個總開關,打開總開關,則進行熔斷檢測,關閉總開關,則不進行熔斷檢測。
golang實現:https://github.com/sony/gobreaker