-
Notifications
You must be signed in to change notification settings - Fork 8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
add degradeCutHalfOpen and fix exceptionCount bug #525
Conversation
Codecov Report
@@ Coverage Diff @@
## master #525 +/- ##
===========================================
+ Coverage 38.02% 38.12% +0.1%
- Complexity 1114 1123 +9
===========================================
Files 259 259
Lines 8171 8306 +135
Branches 1113 1130 +17
===========================================
+ Hits 3107 3167 +60
- Misses 4661 4726 +65
- Partials 403 413 +10
Continue to review full report at Codecov.
|
Hi, thanks for contributing. Please illustrate your design and how-to-do in the PR description. |
降级这里由之前的两种状态变为三种状态,降级关闭,降级打开,降级半开,当降级关闭后后进入一个半开状态,这里会放五个请求过去,如果这五个请求都正常,那么则会由降级半开状态变为降级关闭,有任何一个请求失败,直接进入降级全开状态(我认为业务方应该捕获正常的业务异常,如果5个请求中有一个失败那一定是系统级别的异常,所以此处进入降级是没有问题的)。另外之前异常数与异常比率这里在处于同一个时间窗口时再次判断是会出现问题的,即无论系统是否正常也一定会再次降级。这里异常数目会做一个判断(异常比例没必要,因为我放进去的五个请求成功的话会使得比例倾斜),如果处于同一个时间窗口,会进行<=操作进行判断,如果不是,则维持原有操作(<)。说明:如果处于同一个时间窗口的话没必要进行降级半开状态,处于不同时将窗口的话如果系统未恢复正常,那么就会有一个很尴尬的情况,他会等待他的异常数或者异常数目进入他的一个阈值才会进行降级。比如我的异常数目是1000,那么这里的话熔断关闭后,这个时候可能系统还没有恢复正常,那么会直接放进来1000个请求。 |
对于 HALF-OPEN 而言,根据模式的不同,对应的策略也有不同:
另外考虑兼容性的问题,降级规则可能需要加个 References:
For HALF-OPEN state, the corresponding action varies according to the circuit breaking strategy:
Also considering the compatibility issue, the circuit breaking rule may need an additional |
这里仍然会存在 滑动窗口长度 > 降级时间 的问题。比如分钟级异常数模式,分钟级滑动窗口的格子数为 60(每个格子时间长度为 1s),则降级时间比较小且异常分布在最近的格子比较多时,仍有可能出现熔断结束后异常数 < 阈值时就会被降级的问题。在这种统计模式下,一般需要设置降级时间 > 统计窗口长度。 |
# Conflicts: # sentinel-core/src/main/java/com/alibaba/csp/sentinel/node/StatisticNode.java # sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/statistic/data/MetricBucket.java # sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/statistic/metric/Metric.java
目前是采取这样的做法的,基于rt以及异常比例(s,ms级别的),会把当前窗口的进行清0。因为有一点需要考虑,rt这里的话准降级状态个人认为是必须的,成功状态下肯定没问题,五个请求都OK然后系统继续正常(即未降级),但是如果失败了的话这里不进行清除操作的话有可能存在这样一个问题,系统本来就是处于不正常情况,这五个请求耗时很严重。(如果未做dubbo超时限制),那么熔断后这五个请求会将整体的平均值拉的超级高而高出平均值。(极端情况)。异常比例这里的话这里因为时间短所以也是可以接受的,而且只会清除当前秒级别的异常比例。 |
降级半开的开关也加上了,默认是关闭的。业务方可以自行选择是否开启 |
/** | ||
* minus exception | ||
*/ | ||
void minusException(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
这里的设计可能还要再考量一下。Sentinel 底层的统计数据结构是限流、降级等等共用的,并且监控日志也会从实时统计数据生成,因此需要保证正确性。直接进行 decrease 和 rest 操作会使得实时统计数据不准确。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
您好,目前来看的话限流这里是用总的pass数来进行计算的。(这样是最合理的而且目前也确实是这样做的)。
基于rt这里也已经完善,是拿最近一次请求的rt与count进行比较的。另外这里的话清除的话只会清除当前时间窗口的一个异常rt总和,最小为1个rt(经过多个时间窗口,每次刚进入时间窗口进进入准降级状态),最大为5个rt(持续一个窗口的一个准降级-降级的rt总和)。
异常数目这里还是原有的逻辑,降级关闭之后放进一个请求,依赖于这个请求的结果来进行是否开关。降级打开之前会对分钟秒级别的纬度减去各自所属的时间窗口的值。如果是新的时间窗口则不做操作。
我这里觉得降级关闭之后应该是一个新的开始,所以-1个异常数这里是可以接受的。不这么做的话异常数目这里位于同一个时间窗口降级关闭之后始终是要再次打开的。因为count已经达到了阈值,必须去减
# Conflicts: # sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/block/degrade/DegradeRule.java
[ISSUE alibaba#525] Support the message track. Merge to branch msg_track
…ave supported trace_topic name value Configurable by users.
…crease code coverage.
[ISSUE alibaba#525] Support the message track,add the function which supports trace topic name value configurable by users.
. #154
Describe what this PR does / why we need it
A new half-open state before the fuse is closed will pass a little flow, and if it is normal, it will be fully open. Avoid service without recovering large amounts of traffic
fix bug to DEGRADE_GRADE_EXCEPTION_COUNT。
降级这里由之前的两种状态变为三种状态,降级关闭,降级打开,降级半开,当降级关闭后后进入一个半开状态,这里会放五个请求过去,如果这五个请求都正常,那么则会由降级半开状态变为降级关闭,有任何一个请求失败,直接进入降级全开状态(我认为业务方应该捕获正常的业务异常,如果5个请求中有一个失败那一定是系统级别的异常,所以此处进入降级是没有问题的)。另外之前异常数与异常比率这里在处于同一个时间窗口时再次判断是会出现问题的,即无论系统是否正常也一定会再次降级。这里异常数目会做一个判断(异常比例没必要,因为我放进去的五个请求成功的话会使得比例倾斜),如果处于同一个时间窗口,会进行<=操作进行判断,如果不是,则维持原有操作(<)。说明:如果处于同一个时间窗口的话没必要进行降级半开状态,处于不同时将窗口的话如果系统未恢复正常,那么就会有一个很尴尬的情况,他会等待他的异常数或者异常数目进入他的一个阈值才会进行降级。比如我的异常数目是1000,那么这里的话熔断关闭后,这个时候可能系统还没有恢复正常,那么会直接放进来1000个请求。
Merge state
Does this pull request fix one issue?
Describe how you did it
Describe how to verify it
ut
Special notes for reviews