1为什么需要降级和熔断?
在应用系统中,我们通常会去调用远程的服务或者资源(这些服务或资源通常是来自第三方),对这些远程服务或者资源的调用通常会导致失败,
或者挂起没有响应,直到超时的产生。在一些极端情况下,大量的请求会阻塞在对这些异常的远程服务的调用上,会导致一些关键性的系统资源耗尽,
从而导致级联的失败,从而拖垮整个系统。熔断器模式在内部采用状态机的形式,使得对这些可能会导致请求失败的远程服务进行了包装,
当远程服务发生异常时,可以立即对进来的请求返回错误响应,并告知系统管理员,将错误控制在局部范围内,从而提高系统的稳定性和可靠性。
具体可参考:http://www.cnblogs.com/yangecnu/p/Introduce-Circuit-Breaker-Pattern.html
2降级和熔断区别?
降级是人工干预的,在实际故障时,noc和开发根据监控数据去判断是否需要关闭接口的使用。而熔断是框架根据一定的算法,当错误率达到阈值后,系统自己关闭接口,无需人工干预。
3熔断算法参考
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
4哪些接口需要降级
非关键接口中的核心接口,就是不影响主流程但是访问量比较大的接口需要降级,对于主流程和关键接口需要业务方自行判断。
对于某些业务接口目前访问量小,虽然无需配置降级开关,但是需要支持降级功能,以免业务发展导致接口访问增加,不能降级造成损失。