首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >限制每秒的方法调用次数(达到限制时拒绝)

限制每秒的方法调用次数(达到限制时拒绝)
EN

Stack Overflow用户
提问于 2011-05-18 17:27:28
回答 3查看 6.2K关注 0票数 5

我有一个做一些IO的方法,我想限制对这个方法的调用(每秒),以避免后端获得无法处理的并发请求突发。

如果需求没有“每秒”,我可以在开始请求时使用堆栈(基本上只是一个计数器)和offer(),在完成请求时使用poll()。有了“每秒”的要求,我需要以某种方式清理堆栈上比给定时间段更旧的插槽。

我该如何正确地做到这一点呢?显然,这个结构应该是线程安全的。

谢谢您抽时间见我!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-19 00:26:08

看看this question吧。答案同样适用于这个问题,即使问题的表达方式截然不同。

我承认,我觉得它有点神秘,但它工作得很好。

票数 4
EN

Stack Overflow用户

发布于 2011-05-18 17:36:23

您可以使用队列,但需要进行一些修改。每当您想要添加到队列中(该方法被调用)时,您需要检查其中有多少元素以及它们是何时添加的。可以删除超过一秒之前插入的所有元素。将剩余元素的数量与每秒的速率进行比较,您就可以决定是否拒绝方法执行。如果你打算使用方法块而不是reject,事情可能会变得有点复杂。

可能有许多可能的实现,您必须检查它们对于您的问题是否可行。您还可以查看Token buckets的实现,这是您的问题的一般概念。

票数 3
EN

Stack Overflow用户

发布于 2011-05-18 17:57:55

听起来您需要将IO工作与请求线程解耦,并将其卸载到具有给定大小的线程池中。这样,您就可以显式地控制同时执行IO的线程的数量。

代码语言:javascript
运行
复制
ExecutorService pool = Executors.newFixedThreadPool(10);

public void myMethod() {

  pool.submit(new Runnable() {
    public void run() {
      //Do IO work here
    }
  });

}

在本例中,执行IO工作的线程永远不会超过10个。它不限制每秒请求的数量,但控制并发性可能是一种更好的节流方式。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6042522

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档