Java: вызывать API 200 раз параллельно без ожидаемого возврата - PullRequest
0 голосов
/ 30 ноября 2018

Я бы хотел вызвать REST API 200 раз, но я не уверен, что правильно это сделаю:

ExecutorService es = Executors.newFixedThreadPool(200);

for (i = 0 ; i<200 ; i++) {
    if (check == true) {
        es.submit() -> callTrueAPI();
    } else {
        es.submit() ->callFalseAPI();
    }

    es.shutdown;

Это правильный способ сделать это?

Ответы [ 3 ]

0 голосов
/ 30 ноября 2018

Если у вас нет 200 процессорных ядер, вы не сможете отправить 200 запросов в один и тот же момент.По крайней мере потоки Java не смогут выполняться одновременно.Если у вас обычный ЦП с 4 ядрами, вы, скорее всего, сможете добиться лучших результатов, имея 4 рабочих потока, которые будут отправлять запрос по 50 раз каждый, поэтому вы будете тратить меньше времени на переключение контекста.

Возможно, будет прощеиспользуйте Apache JMeter или Gatling , чтобы создать надлежащий план тестирования с периодом разгона и спада для имитации необходимого трафика.Эти инструменты были созданы именно для той цели, которую вы описываете, и есть отличные примеры.

0 голосов
/ 30 ноября 2018

Вот более компактная версия для версии Java> = 8:

    ExecutorService es = Executors.newFixedThreadPool(200);

    IntStream.range(0, 200).forEach((i) -> es.submit(() -> check ? callTrueAPI() : callFalseAPI()));

    es.shutdown();
0 голосов
/ 30 ноября 2018

У вас неверный синтаксис.Оно должно быть:

ExecutorService es = Executors.newFixedThreadPool(200);

for (int i = 0; i < 200; i++) {
    if (check) {
        es.submit(() -> callTrueAPI());
    } else {
        es.submit(() -> callFalseAPI());
    }
}

es.shutdown();

После shutdown пул потоков будет продолжаться, пока все задачи не будут выполнены .Если вы хотите подождать, пока задачи не будут выполнены, позвоните awaitTermination после вызова shutdown.


Существует проблема с этим подходом.Вы фактически создаете пул с 200 потоками, а затем уничтожаете потоки (затем пул закрывается).Это дорого как в процессоре, так и в памяти.Если вы хотите сделать это более эффективно (с точки зрения ресурсов на стороне клиента):

  1. Используйте меньший пул потоков (!)
  2. Перезапустите пул ... хотя это потребуетиспользуя другой метод для ожидания выполнения задач.

Предполагая, что вызовы REST направляются в другую службу / процесс, вы, вероятно, можете запустить больше потоков, чем у вас есть ядер, ипусть они идут параллельно.Тем не менее, удаленная служба, вероятно, имеет ограничение на число одновременных запросов, которые она может выполнить, поэтому 200 запросов подлежат «резервному копированию» во входной очереди сервера, что может привести к тайм-аутам запросов, ошибкам 5xx и так далее.Следовательно, одновременное выполнение 200 запросов вряд ли будет хорошо для общей пропускной способности.

И если вы делаете это как стресс-тест, есть более реалистичные способы сделать это;см. ответ @ Karol.

...