这是一个非常高级的案例。借助这个案例,你可以达成三个效果:
这个案例就是借助滑动窗口算法来统计一段时间内的超时请求比率,如果超过了比率,那么就认为此时超时不是一个偶发性的问题,不应该继续重试。而后,为了支撑高并发的场景,滑动窗口算法可以借助 ring buffer 来实现,用一个比特来表达请求是否超时。同时可以用原子操作来进一步提高性能,因此你在这个案例下能够聊的话题非常多:
我愿称之为,你拿出去装一次逼,就可以证明你在算法设计上还是有点东西的。
在微服务超时控制和重试策略里面,经常会引用这个案例。代码在 interview-cases/case31_40/case32 at main · meoying/interview-cases (github.com)
普通版本就是使用一个普通的滑动窗口算法,关键点是:
在高并发的情况下,滑动窗口算法的开销是难以忍受的。举个例子来说,即便将窗口限制在 1s,高并发的时候 1s 也有几万个请求,这几万个请求会占据你很多内存。而且在判定要不要重试的时候还要遍历,这也是一个极大的问题。