Мы создали приложение NLP, которое использует «тяжелые», длительные потоки извлечения информации о документе, которые используются в течение всего срока службы приложения.Результат (скажем, 20-120 небольших объектов на документ) затем помещается в очередь блокировки и индексируется в эластичный поиск другим компонентом.Поскольку экстракторам требуется около 3 минут для одного документа, индексатор большую часть времени простаивает и работает очень быстро.У нас есть n
доступных процессорных ядер.
В настоящее время мы просто отправляем все (каждый вызываемый компонент) в fixedThreadPool с n+1
;то есть мы настроили n
извлекаемые вызовы.Это работает довольно хорошо, однако кажется, что либо один из экстракторов голодает, если мы сначала отправляем загрузчик, либо индексатор извлекает из очереди почти в самом конце срока службы приложения.
Как мы можемгарантировать, что индексатор проверяет очередь блокировки «время от времени», не допуская при этом экстракторов, чтобы максимизировать производительность приложения?