使用情况:
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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
rule.setTimeWindow(80); rule.setStatIntervalMs(80000);
要这么设置才有效。你少调用了rule.setStatIntervalMs(80000);
原回答者GitHub用户drgnchan
阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。