ExecutorService, использующий API для отдыха

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

Насколько я знаю, создание потока является дорогостоящей операцией, и поток службы исполнителя будет создан во время отправки задач. И потоки будут уничтожены, когда мы вызовем метод завершения работы службы-исполнителя.

Это процесс каждого запроса в этом сценарии:

  1. вызов API
  2. создать службу-исполнитель
  3. представить четыре будущих задачи
  4. Создайте ответ из всех потоков возврата.
  5. вызвать метод службы исполнителя завершения работы.
  6. вернуть ответ

Итак, мой вопрос заключается в том, что создание службы-исполнителя и потоков в каждом запросе правильно или нет? Или, пожалуйста, дайте мне знать альтернативное решение этого.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
2 881
3

Ответы 3

Создайте синглтон вашего ExecutorService и используйте один и тот же экземпляр для всех запросов. НЕ создавайте его снова и снова. Вы также должны ограничить максимальное количество потоков, принадлежащих ExecutorService, чтобы ваш REST API не взорвал ваш сервер.

Нет, неразумно часто завершать и повторно создавать ExecutorService. В этом весь смысл. Создайте фиксированный пул потоков, так как вы уже знаете количество задач, которые хотите выполнять параллельно. Также отделите обработчик запросов от создания ExecutorService. Обратите внимание, что вы вызываете shutdown(), то есть завершаете текущие задачи и не принимаете новые задачи, его нельзя использовать повторно, он заставляет вас восстанавливать пул для каждого запроса, поэтому старайтесь не завершать пул потоков.

Совершенно нормально использовать пул потоков для распараллеливания обработки входящих запросов. Но создавать новый пул потоков при каждом вызове API — это неправильно.

Чтобы сделать это правильно, вы должны создать отдельный экземпляр ExecutorService и просто использовать его повторно, а выключать его только тогда, когда вы закрываете приложение.

Кроме того, помните о правильном его размере, потому что, если он станет насыщенным, он ухудшит вашу задержку, а не улучшит ее.

Если я создам службу-исполнитель с четырьмя потоками, прежде чем придет запрос. При многократном вызове API первый вызов будет использовать все четыре потока для выполнения четырех задач, а все остальные запросы будут ожидать.

Deepak Gusain 26.02.2019 07:03

Да, именно поэтому я добавил примечание о правильном размере.

Grzegorz Piwowarek 26.02.2019 07:20

То, что я согласен, создавать и уничтожать службу-исполнитель в каждом вызове API неправильно. Размер пула потоков в этом сценарии непрост, или исполнитель пула потоков не подходит для этого контекста? Потому что, например, если мы нажмем rest API 1000 раз, то каков будет размер пула потоков, или если это число увеличится до 10 миллионов, то каков будет размер пула потоков.

Deepak Gusain 26.02.2019 13:14

@DeepakGusain на самом деле, это довольно просто, если вы знаете нефункциональные требования к сервису.

Grzegorz Piwowarek 26.02.2019 13:16

Лучше насытить ExecutorService, чем потреблять 100% ресурсов процессора и снижать производительность всей системы.

Johnny V 26.02.2019 19:37

Другие вопросы по теме