微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

对线程使用 RateLimiter

如何解决对线程使用 RateLimiter

我正在尝试跨线程实现速率限制。 我的应用程序调用外部 API,我们对 TPS 限制达成了严格的协议,超出该限制我的应用程序不应调用 API。对于每个新客户请求,我的应用程序尝试 1) 使用 RateLimiter.tryAcquire() 获取许可并将请求发送到外部 API 或 2) 如果无法获取许可,则请求失败。

为了确保在所有线程/客户请求中使用相同的 RateLimiter 实例,我使用 Spring 注释对它进行了 @Autowired。在单元测试中,我可以断言在任何地方都调用了相同的速率限制器。

RateLimiter.create(1)

我正在尝试通过编写测试来验证是否满足速率限制。代码的简化版本如下所示:

void testRateLimiter() {
    issueRequest();
    issueRequest();
    issueRequest();
}

Future<MyResponse> issueRequest() {
     if (rateLimiter.tryAcquire()) {
          //send request
          final Callback callback =
                this.okHttpCallbackFactory.createMeasuredCallback(this::onReply,this.ResponseFuture::completeExceptionally);
          this.httpClient.newCall(request).enqueue(callback);
          System.out.println("Request Issued.");
     } else {
         //Failed
         this.ResponseFuture.completeExceptionally(exc);
         System.out.println("Throttled.");
     }
}

但观察到的输出是:

Request issued. 2021-Mar-18 12:34:52 AM
Request issued. 2021-Mar-18 12:34:52 AM
Throttled. 2021-Mar-18 12:34:52 AM

如果请求设置为 1 TPS,为什么允许两个请求?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。