У меня есть API, который выполняет четыре задачи. Если мы сделаем последовательный, этот API займет больше времени.
Чтобы повысить производительность, я использовал структуру службы Executor и отправил четыре задачи с помощью службы executor.
Насколько я знаю, создание потока является дорогостоящей операцией, и поток службы исполнителя будет создан во время отправки задач. И потоки будут уничтожены, когда мы вызовем метод завершения работы службы-исполнителя.
Это процесс каждого запроса в этом сценарии:
Итак, мой вопрос заключается в том, что создание службы-исполнителя и потоков в каждом запросе правильно или нет? Или, пожалуйста, дайте мне знать альтернативное решение этого.




Создайте синглтон вашего ExecutorService и используйте один и тот же экземпляр для всех запросов. НЕ создавайте его снова и снова. Вы также должны ограничить максимальное количество потоков, принадлежащих ExecutorService, чтобы ваш REST API не взорвал ваш сервер.
Нет, неразумно часто завершать и повторно создавать ExecutorService. В этом весь смысл. Создайте фиксированный пул потоков, так как вы уже знаете количество задач, которые хотите выполнять параллельно. Также отделите обработчик запросов от создания ExecutorService. Обратите внимание, что вы вызываете shutdown(), то есть завершаете текущие задачи и не принимаете новые задачи, его нельзя использовать повторно, он заставляет вас восстанавливать пул для каждого запроса, поэтому старайтесь не завершать пул потоков.
Совершенно нормально использовать пул потоков для распараллеливания обработки входящих запросов. Но создавать новый пул потоков при каждом вызове API — это неправильно.
Чтобы сделать это правильно, вы должны создать отдельный экземпляр ExecutorService и просто использовать его повторно, а выключать его только тогда, когда вы закрываете приложение.
Кроме того, помните о правильном его размере, потому что, если он станет насыщенным, он ухудшит вашу задержку, а не улучшит ее.
Да, именно поэтому я добавил примечание о правильном размере.
То, что я согласен, создавать и уничтожать службу-исполнитель в каждом вызове API неправильно. Размер пула потоков в этом сценарии непрост, или исполнитель пула потоков не подходит для этого контекста? Потому что, например, если мы нажмем rest API 1000 раз, то каков будет размер пула потоков, или если это число увеличится до 10 миллионов, то каков будет размер пула потоков.
@DeepakGusain на самом деле, это довольно просто, если вы знаете нефункциональные требования к сервису.
Лучше насытить ExecutorService, чем потреблять 100% ресурсов процессора и снижать производительность всей системы.
Если я создам службу-исполнитель с четырьмя потоками, прежде чем придет запрос. При многократном вызове API первый вызов будет использовать все четыре потока для выполнения четырех задач, а все остальные запросы будут ожидать.