Один или несколько пулов потоков для Java-сервера?
Я пишу довольно сложное приложение Java-сервера, которое имеет значительную часть обработки фона в дополнение к обычной обработке запроса-ответа. Некоторые из фоновой обработки выполняются cron-подобным образом с использованием рамки Quartz. Другие задачи более востребованы - если новый клиент подключается, он создает дополнительное задание для его обновления через некоторое время. Задачи cron также могут варьироваться - некоторые выполняют мониторинг внешних приложений, некоторые рассчитывают статистику и т.д.
Я использую несколько пулов потоков для запуска всех этих заданий с идеей о том, что подобные задания будут совместно использовать пул потоков, но разные задания не будут делиться ими. Например, задания мониторинга никогда не будут выполняться в пуле статистики, а задания статистики никогда не будут выполняться в пуле мониторинга.
С другой стороны, я знаю, что некоторые люди предпочли бы просто иметь единственный пул потоков и запускать все на нем без какого-либо разделения.
Интересно, что считается наилучшей практикой в таком сценарии.
Каковы преимущества минус разделение пулов потоков?
Это даже имеет значение?
Ответы
Ответ 1
Ответ зависит от того, нужно ли разделять ресурсы приложений между различными типами действий или нет.
Например, я в настоящее время пишу серверное приложение, состоящее из нескольких высокопроизводительных писателей и потенциально многих читателей. Читатели будут получать доступ к приложению спорадически, но могут запросить много данных (т.е. Длительные запросы). Мне нужно убедиться, что авторы никогда не голодают, поэтому я собираюсь использовать два пула потоков в своем дизайне для чтения/записи. Если пул потоков читателя временно исчерпан, авторы не будут затронуты; только запросы на чтение будут отложены.
Альтернативой могло бы быть использование PriorityQueue
в сочетании с ThreadPoolExecutor
и назначение более высокого приоритета для запросов на запись.
Итак, в заключение - Моим советом было бы: Начать с одного пула потоков и только сделать ваш проект более сложным, если есть конкретная причина для этого.
Ответ 2
Это не прямой ответ, но другое предложение: - (
Ваши задания на кварце могут быть приостановлены, отменены и т.д., позвольте называть его . Думаю, вы создадите некоторый пользовательский интерфейс, чтобы управлять ими.
Вы понимаете, что ваши другие задания ( "по требованию" ) не будут пользоваться теми же функциями, если вы не реализуете их, конечно? Считаете ли вы, что вы делаете все кварцевое задание (даже если оно начинается сразу), чтобы получить единый код?