5 分ごとに実行されるバックグラウンド スレッドがあります。私はScheduledExecutorService
これに使用しています。5 分ごとに、サービスの 1 つを呼び出し、そのサービスから返される応答を解析しています。
public class ThreadScheduler {
private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
public void startScheduleTask() {
scheduler.scheduleAtFixedRate(new Runnable() {
public void run() {
try {
callService();
} catch (Exception ex) {
// log error
}
}
}, 0, 5L, TimeUnit.MINUTES);
}
public void callService() throws Exception {
// execute the service and parse the response
}
}
現在、上記のコードは 1000 台のマシンで実行されており、それらはすべて同時に開始されているため、5 分ごとに 1000 回すべての呼び出しが同時にサービスに対して行われます。5 分間のウィンドウで負荷をより均等に分散しようとしています。上記のコードでこれを行うことは可能ですか?
すべてのシステムが同時に起動すると、より多くの負荷がかかるように、サービスに同時に負荷がかからないように、5 分間のウィンドウでサービスの負荷をより均等に分散しようとしています。
5 分間のウィンドウで負荷をより均等に分散させるために、次のコードを思いつきました。
public class ThreadScheduler {
private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
public void startScheduleTask() {
scheduler.scheduleAtFixedRate(new Runnable() {
public void run() {
try {
callService();
} catch (Exception ex) {
// log error
}
}
}, (int)(Math.random()*5*60), 5*60L, TimeUnit.SECONDS);
}
public void callService() throws Exception {
// execute the service and parse the response
}
}
これは、5 分間のウィンドウで負荷を均等に分散する正しい方法ですか。