有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!


共 (4) 个答案

  1. # 1 楼答案

    RateLimitor的要点是您将其作为被调用服务的一部分(或包装服务),这样它就可以保护自己不被频繁调用。您的线程睡眠选项必须由服务的客户端使用,因此您正在比较两种不同的东西

    这里有一篇关于what you can do with RateLimiter的好文章

  2. # 2 楼答案

    使用RateLimiter,因为它正好适合您限制对服务访问的用例。除了从JavaDoc中:

    Rate limiters are often used to restrict the rate at which some physical or logical resource is accessed.

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

  3. # 3 楼答案

    区别在于延迟

    调用线程的最简单方法。睡眠(1s)然后每个请求都会将每个请求的速度降低至少1s

    Guava速率限制器将在决定阻止之前检查已看到多少请求。因此,许多呼叫可能在相对无延迟的情况下接通

    当然,可以编写比使用线程阻止每个请求的天真方法更智能的实现。睡觉然而,在这一点上,人们将重新发明番石榴方法

  4. # 4 楼答案

    我不是RateLimiter专家,但这里有几点我想说:

    1. RateLimiter的主要优点之一是,当请求从多个地方发出(或传入)时,它能够控制请求的速率,通常是在多个线程上
    2. 如果您在单个线程上顺序调用此服务,RateLimiter可能不是必需的。。。这是一个比设计时简单得多的案例
    3. 不过,(正如其他人所提到的)它会比Thread.sleep(1000)更准确地将你的请求限制在每秒一个请求上,因为睡眠并没有考虑到在发出请求时做任何工作所需的时间
    4. 我不清楚你是否真的试图限制你对该服务的呼叫,或者你真正想要的是每秒发生一次的预定任务。如果是后者,像^{}^{}这样的东西可能更可取