关于文档里熔断器抖动问题的一个小的想法
- 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
Assessment
This issue has not been assessed yet.