Предотвратить медленную работу над пулом потоков - PullRequest
0 голосов
/ 31 января 2019

У меня есть система, в которой в настоящее время у каждой работы есть свой собственный класс Runnable, и я заранее определил фиксированное число потоков для каждой работы.

Насколько я понимаю, это неправильная практика, потому что:

  1. Необходимо настроить количество потоков в зависимости от машины, на которой выполняется процесс.
  2. Каждый поток может выполнять только один тип задания.

Вы согласны с этим?(текущее решение неверно)


Итак, я бы хотел использовать что-то вроде ThreadPool в Java.Я находился в конфликте с аргументом, утверждающим, что при этом медленные задания будут занимать большую часть пула потоков , не оставляя места другим работам.Принимая во внимание, что с текущим решением фиксированное число потоков было назначено медленному рабочему, и это не повредит другим.

(обратите внимание, что вы не можете априори знать, будет ли работа «медленной»)


Как система может быть адаптивной в отношении количества потоковон использует, но в то же время не привязан к самой медленной работе?

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Это скорее проблема бизнеса.Допустим, я оператор связи.Я запрещаю своим абонентам совершать исходящие звонки, когда они не очищают свои взносы.Когда они делают платеж, я снимаю флажок, и через секунду абонент может совершать звонки.Но в моей системе происходит множество других действий, таких как обработка использования, выставление счетов, форматирование счетов и т. Д.

Теперь давайте предположим, что у меня есть общий пул потоков для всей системы, и я начал выставлять счета 50 000 подписчиков.Все мои потоки теперь обрабатывают относительно длительные платежные задания, и накапливается огромная очередь.

Бедный клиент сейчас делает платеж и хочет сделать срочный вызов.Но в моем пуле не осталось потока, чтобы очистить флаг.Клиенту пришлось ждать час, прежде чем он сможет сделать звонок.Это нарушение SLA.

Я должен был создать отдельные пулы потоков.Если задания по разблокировке вызовов не очень частые и короткие, я могу создать для них отдельный пул с размером ядра 5, может быть.Для биллинговых заданий я бы предпочел создать пул с размером ядра 25 и максимальным размером 30.

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

Это также облегчит отладку.Если у меня есть разные шаблоны имен потоков для каждого пула и в моей системе есть некоторые проблемы.Я легко могу сделать дамп потока и понять, является ли виновным факт оплаты или оплаты.

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

0 голосов
/ 31 января 2019

Вы можете попытаться получить время, необходимое для выполнения задания (с помощью сорта ручной работы Timer. Затем вы нормализуете это значение, поделив это время на максимальное время, затраченное данным потоком. Наконец,Вы умножаете это число на фиксированное число, которое варьируется в зависимости от того, сколько потоков вы хотите запустить на одно задание в секунду. Это будет запрошенное количество потоков, которое должен использовать этот процесс. Вы можете настроить его в соответствии с этим.

Редактировать: Вы можете установить минимальные и максимальные значения, которые определяют количество потоков, на которые имеет право задание. Вы также можете запросить потоки из очень просторного задания, когда в систему входит другой поток.

Надеюсь, это поможет!

...