Управление очередью TPL

У меня есть служба, которая выполняет сканирование различных серверов. Рассматриваемые сети могут быть огромными (сотни тысяч сетевых узлов).

Текущая версия программного обеспечения использует разработанную нами архитектуру очередей/потоков, которая работает, но не так эффективна, как могла бы быть (не в последнюю очередь из-за того, что задания могут порождать дочерние элементы, которые плохо обрабатываются)

Готовится версия 2, и я рассматриваю возможность использования TPL.Вроде как должно идеально подходить.

Я видел этот вопрос, ответ на который подразумевает, что TPL может справиться с неограниченными задачами. В моих простых тестах (раскрутить 100 000 задач и передать их TPL) TPL довольно рано выдал исключение Out-Of-Memory (достаточно честно — особенно на моем dev box).

Сканирование занимает разное время, но в среднем 5 минут на задание.

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

У меня уже есть инфраструктура, которая позволяет распределять задания сканирования (хранящиеся в базе данных) между несколькими серверами сканирования, но вопрос заключается в том, как именно я должен передать работу TPL на конкретном сервере.

Могу ли я отслеживать размер очереди TPL и (скажем) пополнять ее, если она упадет ниже пары сотен записей? Есть ли недостаток в этом?

Мне также нужно обработать ситуацию, когда сканирование необходимо приостановить. Кажется, это проще сделать, не отдавая работу TPL, чем отменяя/сбрасывая задачи, которые могут быть уже частично обработаны.

Все начальные задачи можно запускать в любом порядке. Дети должны запускаться после того, как родитель начал выполняться, но поскольку родитель их порождает, это никогда не должно быть проблемой. Детей можно запускать в любом порядке. Из-за этого я в настоящее время предполагаю, что дочерние задачи будут записываться обратно в базу данных, а не порождаться непосредственно в TPL. Это позволило бы другим серверам «воровать работу», если это необходимо.

Есть ли у кого-нибудь опыт использования TPL таким образом? Есть ли какие-то соображения, о которых мне нужно знать?

5
задан Community 23 May 2017 в 12:22
поделиться