【发布时间】:2011-09-08 14:46:42
【问题描述】:
我正在寻找一个好的解决方案,或者可能是一个 API 来解决以下问题:
- 我的应用程序循环执行一项任务,例如它发送电子邮件等。我需要将平均消息速率限制为例如每秒 100 条消息或每最后一分钟 1000 条消息...
不,我正在寻找能够完成这项任务的算法或 API。
【问题讨论】:
-
这是为了避免在 SpamBots 中引发警报吗?
标签: java performance rate
我正在寻找一个好的解决方案,或者可能是一个 API 来解决以下问题:
不,我正在寻找能够完成这项任务的算法或 API。
【问题讨论】:
标签: java performance rate
您可以使用ScheduledExecutorService 来安排给定时间段内的任务。
例如,要每秒安排 100 个任务,您可以这样说:
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(nThreads);
scheduler.scheduleAtFixedRate(mailSender, 0, 10, TimeUnit.MILLISECONDS);
显然,您需要跟踪执行了多少任务并在作业完成后关闭调度程序。
【讨论】:
Token bucket algorithm 非常容易实现和使用,但功能非常强大。您可以在运行时控制吞吐量并将一些请求排队以处理 peek。
【讨论】:
我能想到的最简单的方法是延迟发送每封电子邮件的时间,具体取决于等待的邮件数量。
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 类可以做到这一点。
【讨论】: