java中的速率控制
我正在寻找一个好的解决方案或可能是一个API来解决以下问题:
- 我的应用程序在循环中执行任务,例如它发送电子邮件等。我需要将消息的平均速率限制为例如每秒100条消息或每分钟1000条消息……
不,我正在寻找完成此任务的算法或API。
您可以使用ScheduledExecutorService来计划给定时间段内的任务。
例如,要每秒安排100个任务,您可以说:
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(nThreads); scheduler.scheduleAtFixedRate(mailSender, 0, 10, TimeUnit.MILLISECONDS);
显然,您需要跟踪已执行的任务数量,并在作业完成后关闭调度程序。
令牌桶算法非常容易实现和使用,但function非常强大。 您可以在运行时控制吞吐量并将某些请求排入队列以处理查询。
我能想到的最简单的方法是根据等待的数量来延迟发送每封电子邮件的时间。
final ScheduledThreadPoolExecutor service = new ScheduledThreadPoolExecutor(1); int ratePerSecond = ... public static void execute(Runnable run) { int delay = 1000 * service.getQueue().size() / ratePerSecond; service.schedule(run, delay, TimeUnit.MILLISECONDS); }
这将确保任务仅在速率允许时尽可能接近一起执行。
Guava有一个RateLimiter类,就是这样做的。