假设我想做的就是以特定的速率拨打服务,比如说每秒1次,那么Guava RateLimiter提供的服务优于简单的Thread.sleep(1000)
?
答案 0 :(得分:2)
我不是RateLimiter
专家,但我还想提出几点:
RateLimiter
的主要好处之一是它能够在多个地方(通常是多个线程)进行(或进入)请求时控制请求率。RateLimiter
可能不是必要的 ...那就是多了比它设计的简单案例。Thread.sleep(1000)
,因为睡眠不考虑在完成请求时完成任何工作所需的时间。ScheduledExecutorService
或ListeningScheduledExecutorService
之类的内容。答案 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阻止每个请求的天真方法。然而,在那时,人们将重新发明番石榴方法。