单位时间内统计异常次数统计功能逻辑问题 | CircuitBreaker statIntervalM

使用情况:

   List<DegradeRule> rules = new ArrayList<>();
    DegradeRule rule = new DegradeRule();
    rule.setResource(KEY);
   // 80s内调用接口出现异常次数超过5的时候, 进行熔断
    rule.setCount(5);
    rule.setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_COUNT);
    rule.setTimeWindow(80);
    rules.add(rule);
    DegradeRuleManager.loadRules(rules);

看到源码ExceptionCircuitBreaker.class中,创建的LeapArray stat是,只有一个窗口,并且intervalInMs是1000毫秒的。那么这个LeapArray就只能统计1秒内的数据了。

当在ExceptionCircuitBreaker类的handleStateChangeWhenThresholdExceeded方法中,判断错误数量是否大于threshold,那就变得只能1秒钟内有80次才会,进行熔断。

而需求是要80s内5次。这个时间维度是80秒,就没法用LeapArray stat的1秒时间维度统计出来

原提问者GitHub用户kelvin-cai

展开
收起
学习娃 2023-05-19 14:31:07 1265 分享 版权
1 条回答
写回答
取消 提交回答
  • rule.setTimeWindow(80); rule.setStatIntervalMs(80000);

    要这么设置才有效。你少调用了rule.setStatIntervalMs(80000);

    原回答者GitHub用户drgnchan

    2023-05-19 20:04:14
    赞同 展开评论
问答地址:

阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。

还有其他疑问?
咨询AI助理