使用像Guava RateLimiter这样的库而不是简单的Thread.sleep有什么好处?

时间:2015-06-22 12:57:32

标签: java thread-safety guava rate-limiting

假设我想做的就是以特定的速率拨打服务,比如说每秒1次,那么Guava RateLimiter提供的服务优于简单的Thread.sleep(1000)

4 个答案:

答案 0 :(得分:2)

我不是RateLimiter专家,但我还想提出几点:

  1. RateLimiter的主要好处之一是它能够在多个地方(通常是多个线程)进行(或进入)请求时控制请求率。
  2. 如果您在一个帖子上按顺序对此服务进行所有调用,RateLimiter可能不是必要的 ...那就是多了比它设计的简单案例。
  3. 尽管如此,(正如其他人所提到的),它会更好地将您的每秒一次请求准确限制为Thread.sleep(1000),因为睡眠不考虑在完成请求时完成任何工作所需的时间。
  4. 我不清楚您是否真的试图限制对服务的调用,或者您实际想要的是每秒发生一次的计划任务。如果是后者,可能更喜欢ScheduledExecutorServiceListeningScheduledExecutorService之类的内容。

答案 1 :(得分:1)

RateLimiter的一点是让它成为被调用的服务(或包装服务)的一部分,因此它可以保护自己不被过于频繁地调用。您的Thread#sleep替代方案必须由服务的客户端使用,因此您需要比较两种不同的东西。

这是关于what you can do with RateLimiter的好文章。

答案 2 :(得分:1)

使用RateLimiter,因为它适合您严格限制对服务的访问的用例。除了 JavaDoc

  

速率限制器通常用于限制访问某些物理或逻辑资源的速率。

当然,您可以使用Thread.sleep代替,但您必须编写跟踪您上次自己最后一次调用服务的功能,或者您必须不加区别地阻止您的服务的每次执行(可能会不必要地阻止)第一次或最后一次执行。)

答案 3 :(得分:1)

不同之处在于延迟。

每个请求调用Thread.sleep(1s)的最简单方法是将每个请求减慢至少1秒。

番石榴速率限制器将在决定阻止之前检查已经看过多少请求。因此,许多呼叫可能会相对没有延迟。

当然,可以编写一个更聪明的实现,而不是使用Thread.sleep阻止每个请求的天真方法。然而,在那时,人们将重新发明番石榴方法。