Sentinel的漏桶算法限流实现是不是不太准?

https://blog.csdn.net/xiaoyi5224765/article/details/115706271
为什么这个Sentinel的 漏桶算法 限流 RateLimiterController 的实现中:

 if (expectedTime <= currentTime) {//@5
        // Contention may exist here, but it's okay.
        latestPassedTime.set(currentTime);
        return true;
    } else {

   }

期望时间小于当前时间 则放行, 这个代码存在并发的情况,怎么他还 is ok? 这玩意是不是不准?
没保证只有一个线程成功更新latestPassedTime。

b

阅读 691
avatarAI BotBETA

这个问题涉及到并发编程和限流算法的实现。首先,漏桶算法是一种常见的限流算法,用于控制流量速率。在Sentinel的RateLimiterController实现中,使用了漏桶算法来限制流量。

关于你的问题,代码中的expectedTime代表的是某个时间点,在这个时间点内,如果有请求到达,那么会判断这个请求是否应该被放行。如果expectedTime小于等于currentTime,即请求到达的时间早于或等于期望的时间点,那么这个请求会被放行。这里的并发情况确实存在,但是这是漏桶算法的一种特性,可以允许一定程度的并发执行。

漏桶算法本身并不是完美的,它并不能完全保证只有一个线程成功更新latestPassedTime。但是,在实际应用中,这种并发执行的情况并不会对限流的效果产生太大影响。因为漏桶算法的主要目的是控制流量速率,而不是精确地限制每个请求的执行时间。在实际情况中,由于操作系统的调度和网络延迟等因素,很难做到精确的时间控制。

另外,Sentinel 作为一款分布式系统流量控制框架,其设计目标是为了提供一种可扩展、可配置的限流方案,以满足不同场景下的限流需求。在Sentinel中,RateLimiterController的实现是基于漏桶算法的,该算法本身已经考虑了并发执行的情况,并且在实际应用中得到了广泛的验证和认可。

因此,尽管代码中存在并发执行的情况,但是这并不会对限流的效果产生太大影响。在实际应用中,需要根据具体场景和需求来选择合适的限流算法和配置方案。

1 个回答

他这个限流算法在业务上其实做的粗略,并不会特别影响实际业务的执行,如果为了这个流量的搞精度,用上了锁,或者影响了太多性能那就得不偿失了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进