java - 每秒的java限制方法调用( 达到限制时拒绝)

  显示原文与译文双语对照的内容
96 5

我有一个方法做某些事情,我想限制调用( 每秒),以避免后端不能处理它的并发请求。

如果需求没有"每秒",我可以在启动一个请求时使用堆栈( 只是个计数器) 和 offer(),而在完成请求时。有了"每秒"需求,我将需要清理堆栈上比给定时间长的槽。

我如何正确地做这些?结构应该是线程安全的,显然。

谢谢您 抽时间 见 我!

时间:原作者:

113 5

请看一下这个问题。答案同样适用于这个问题,即使这个问题的表达方式是不同的。

我承认,我觉得有点神秘,但效果很好。

原作者:
85 4

你可以使用队列,但需要进行一些修改。每当你想要添加到队列( 该方法被调用) 时,你就可以检查它的中有多少元素和添加的元素。所有插入了超过一秒钟的元素都可以删除。比较剩余元素的数量和每秒的速率,你有决定是否拒绝方法执行或者不执行该方法。如果你想要使用方法块而不是拒绝,它可以能会更复杂一点。

可能有许多可能的实现,你必须检查它们对于你的问题是否可行。你还可以看一下令牌桶的实现,这是你的问题的一般概念。

原作者:
90 0

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

ExecutorService pool = Executors.newFixedThreadPool(10);
public void myMethod() {
 pool.submit(new Runnable() {
 public void run() {
//Do IO work here
 }
 });
}

在这个例子中,永远不会有超过 10个线程执行IO工作。它不限制每秒请求数,但控制并发性可能是更好的限制方法。

原作者:
...