在應用系統中,咱們一般會去調用遠程的服務或者資源(這些服務或資源一般是來自第三方),對這些遠程服務或者資源的調用一般會致使失敗,php
或者掛起沒有響應,直到超時的產生。在一些極端狀況下,大量的請求會阻塞在對這些異常的遠程服務的調用上,會致使一些關鍵性的系統資源耗盡,html
從而致使級聯的失敗,從而拖垮整個系統。熔斷器模式在內部採用狀態機的形式,使得對這些可能會致使請求失敗的遠程服務進行了包裝,java
當遠程服務發生異常時,能夠當即對進來的請求返回錯誤響應,並告知系統管理員,將錯誤控制在局部範圍內,從而提升系統的穩定性和可靠性。python
具體可參考:http://www.cnblogs.com/yangecnu/p/Introduce-Circuit-Breaker-Pattern.html算法
降級是人工干預的,在實際故障時,noc和開發根據監控數據去判斷是否須要關閉接口的使用。而熔斷是框架根據必定的算法,當錯誤率達到閾值後,系統本身關閉接口,無需人工干預。api
python soa閾值: 最低請求次數10,每3s統計一次數據,統計10次,沒有達到最低請求次數,每次等待3s 最低次數達到,計算一次,沒有問題,繼續統計,錯誤率達到50%,熔斷,最快20s恢復。 'METRICS_GRANULARITY': 3, # sec 'METRICS_ROLLINGSIZE': 10, 'HEALTH_MIN_RECOVERY_TIME': 20, # sec 'HEALTH_MAX_RECOVERY_TIME': 10 * 30, # sec 'HEALTH_THRESHOLD_REQUEST': 10 * 1, # per `INTERVAL` 'HEALTH_THRESHOLD_TIMEOUT': 0.5, # percentage per `INTERVAL` 'HEALTH_THRESHOLD_SYS_EXC': 0.5, # percentage per `INTERVAL` 'HEALTH_THRESHOLD_UNKWN_EXC': 0.5, # percentage per `INTERVAL` java soa閾值: 1)熔斷的對象:java的熔斷是在client端,而且針對java方法級別。 2)熔斷的計算策略: 每3秒計算一次,統計當前時間點前30秒內請求的錯誤率。知足這2點:請求總數大於60;請求的錯誤率 =(非ServiceException + TimeoutException)/ 總的請求數 > 50%,就會觸發熔斷,再也不向服務端發送請求。 在熔斷以後,會等待至少20秒嘗試去恢復。若是嘗試成功,則熔斷開關關閉,正常向server發送請求。 3)恢復策略: 恢復發生在熔斷以後20秒,若是有請求到來,則放行一條請求用於測試服務端提供服務的質量(其餘併發來的請求仍是處於熔斷中)。若是這條測試的請求,返回正確的值(ServiceException或Response),則熔斷關閉。 若是熔斷以後,再也沒有請求,則在30秒後,自動關閉熔斷。(緣由2個:1是30秒內無請求,意味着錯誤率爲0了;2是業務考慮,若是高峯期結束時正好熔斷,後面再也不有請求,這會致使熔斷開關一直處於打開狀態,下一次請求高峯時,會有部分請求被熔斷。) 4)熔斷以後行爲: 一旦熔斷以後,client的請求會直接調用fallback。fallback是由service接口的默認實現提供。 5)熔斷觸發時的log和metric: metric:當熔斷開關打開時,每條請求都會打一條熔斷metric:名稱:soa-break;tags: service:服務名稱,api:方法名稱(含包名,類名),status:on log:當計算髮現須要熔斷時,打一條error記錄 api: apiName, status : NotHealth;當恢復成功時,打一條error記錄 api: apiName, status: Health, reason: single test passed.;當恢復失敗時,打一條error記錄 api: apiName, status: NotHealth, reason: single test passed. private float errorPercentageThreshold = 0.5f; private long checkWindowInMillis = 3000l; private long calculateWindowInMillis = 3000l; private int bucketNumber = 10; private int requestCountThreshold = 60; private long singleTestWindowInMillis = 20000l; 具體描述請參考:SOA 熔斷算法 php閾值: 最低請求次數20,每20s統計一次數據,統計20次,沒有達到最低請求次數,每次等待20s 最低次數達到,計算一次,沒有問題,繼續統計,錯誤率達到75%,熔斷,最快20s恢復 hhvm.health.rolling_size = 20 hhvm.health.rolling_granularity = 20 hhvm.health.min_recovery_time = 20 hhvm.health.max_recovery_time = 600 hhvm.health.threshold_error_rate = 75 hhvm.health.threshold_error_count = 10
非關鍵接口中的核心接口,就是不影響主流程可是訪問量比較大的接口須要降級,對於主流程和關鍵接口須要業務方自行判斷。併發
對於某些業務接口目前訪問量小,雖然無需配置降級開關,可是須要支持降級功能,以避免業務發展致使接口訪問增長,不能降級形成損失。框架