002降级及熔断

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哪些接口需要降级

非关键接口中的核心接口,就是不影响主流程但是访问量比较大的接口需要降级,对于主流程和关键接口需要业务方自行判断。

对于某些业务接口目前访问量小,虽然无需配置降级开关,但是需要支持降级功能,以免业务发展导致接口访问增加,不能降级造成损失。

猜你喜欢

转载自www.cnblogs.com/itcomputer/p/10901219.html
今日推荐