cloudwego / cloudwego/kitex

关于文档里熔断器抖动问题的一个小的想法

Open
#764 1 comment 0 reactions 0 assignees View on GitHub
Dominant language
Go
Stars
8k
Forks
918
Avg merge
1d 13h
Merged PRs (30d)
7

Description

随着时间的移动,窗口内最老的那个桶会过期,当最后那个桶过期时,则会出现了抖动;

举个例子:

你将 10 秒分为了 10 个桶,0 号桶对应了 [0S,1S) 的时间,1 号桶对应 [1S,2S),…,9 号桶对应 [9S,10S);

在 10.1S 时,执行一次 Succ,则 circuitbreaker 内会发生下述的操作;

(1) 检测到 0 号桶已经过期,将其丢弃;
(2) 创建新的 10 号桶,对应 [10S,11S);
(3) 将该次 Succ 放入 10 号桶内;
在 10.2S 时,你执行 Successes() 查询窗口内成功数,则你得到的实际统计值是 [1S,10.2S) 的数据,而不是 [0.2S,10.2S);

如果使用分桶计数的办法,这样的抖动是无法避免的,比较折中的一个办法是将桶的个数增多,可以降低抖动的影响;

如划分 2000 个桶,则抖动对整体的数据的影响最多也就 1/2000; 在该包中,默认的桶个数也是 2000,桶时间为 5ms,总体窗口为 10S;

当时曾想过多种技术办法来避免这种问题,但是都会引入更多其他的问题,如果你有好的思路,请 issue 或者 PR.

-------------------
我的想法是,多保留一个桶,也就是10个桶的话,当插入第11个桶的时候不删除第0个桶,插入第12个桶的时候再删除第0个桶。这样的话,在 10.2S 时执行 Successes() 查询窗口内成功数时,可以查[1S,10.2S)的数据,在加上[0S,1S)这个桶的数据的4/5(默认数据大部分情况下是分布均匀的)

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.