0

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 分間のウィンドウで負荷を均等に分散する正しい方法ですか。

4

1 に答える 1

1

それはいくらか助けになりますが、スケジュールは最初の変動の後でまだ固定されています. 負荷をさらに分散する別の方法は、「固定遅延のスケジュール」を使用し、実行ごとに短いランダムな一時停止を入れることです(たとえば、Thread.sleep(Math.random()*5000L)の直前callService())。それは時間の経過とともにより多くの変動を引き起こします。

さらに、変動性をテストするために、実際のサービスを呼び出す代わりに、現在の時刻 (ミリ秒単位) を出力する簡単なテスト プログラムを作成できます。さまざまなアルゴリズムを使用してテスト プログラムを 1 時間実行し、結果をグラフ化します。最適なスプレッドを提供するバージョンを選択してください。

于 2014-08-30T16:33:15.433 に答える