контроль скорости в Java - PullRequest
4 голосов
/ 08 сентября 2011

Я ищу хорошее решение или, возможно, API для решения следующей проблемы:

  • Мое приложение выполняет задачу в цикле, например, оно отправляет электронные письма и т. Д. Мне нужно ограничить среднюю скорость сообщений, например, до 100 сообщений в секунду или 1000 сообщений в последнюю минуту ...

Нет, я ищу алгоритм или API, который выполняет именно эту задачу.

Ответы [ 4 ]

4 голосов
/ 08 сентября 2011

Алгоритм Bucket Token очень прост в реализации и использовании, но очень мощный. Вы можете контролировать пропускную способность во время выполнения и ставить в очередь некоторые запросы для обработки вызовов.

4 голосов
/ 08 сентября 2011

Вы можете использовать ScheduledExecutorService для планирования задач на определенный период времени.

Например, чтобы запланировать 100 задач в секунду, вы можете сказать:

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(nThreads);
scheduler.scheduleAtFixedRate(mailSender, 0, 10, TimeUnit.MILLISECONDS);

Очевидно, что вам нужно отслеживать, сколько задач было выполнено, и выключать планировщик после выполнения задания.

3 голосов
/ 06 июня 2013

У Гуавы есть класс RateLimiter , который делает именно это.

3 голосов
/ 08 сентября 2011

Самый простой способ, который я могу придумать, - это отложить отправку каждого письма в зависимости от того, сколько их ожидают.

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);
}

Это обеспечит выполнение задач настолько близко друг к другу, насколько позволяет скорость.

...