zoukankan      html  css  js  c++  java
  • 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哪些接口需要降级

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

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

  • 相关阅读:
    使用urllib
    spring常用的45个注解
    音痴
    android与JS函数传参遗留问题
    方舟编译器源码过一遍流程
    什么是语义学,解释器
    synchronized,ReentrantLock解决锁冲突,脏读的问题
    【Unity3d】ScrollRect自动定位到某点
    计算点到直线的距离】 C#实现
    理财-房月供占工资多少比较合适?
  • 原文地址:https://www.cnblogs.com/itcomputer/p/10901219.html
Copyright © 2011-2022 走看看