次の問題を解決するための適切な解決策またはおそらく API を探しています。
- 私のアプリケーションはループでタスクを実行します。たとえば、電子メールなどを送信します。メッセージの平均レートを、たとえば 1 秒あたり 100 メッセージまたは最後の 1 分あたり 1000 メッセージに制限する必要があります ...
いいえ、まさにこのタスクを実行するアルゴリズムまたは API を探しています。
次の問題を解決するための適切な解決策またはおそらく API を探しています。
いいえ、まさにこのタスクを実行するアルゴリズムまたは API を探しています。
ScheduledExecutorServiceを使用して、特定の期間のタスクをスケジュールできます。
たとえば、1 秒あたり 100 のタスクをスケジュールするには、次のように言えます。
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(nThreads);
scheduler.scheduleAtFixedRate(mailSender, 0, 10, TimeUnit.MILLISECONDS);
明らかに、実行したタスクの数を追跡し、ジョブが完了したらスケジューラをオフにする必要があります。
トークン バケット アルゴリズムは、実装と使用が非常に簡単ですが、非常に強力です。実行時にスループットを制御し、一部のリクエストをキューに入れてピークを処理できます。
私が考えることができる最も簡単な方法は、待機しているメールの数に応じて、各メールの送信タイミングを遅らせることです。
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);
}
これにより、タスクがレートが許す限り一緒に実行されるようになります。