В последнее время я много читаю о потоковой передаче, так как я ищу для разработки высокопроизводительного масштабируемого TCP-сервера, способного обрабатывать до 10 000-20 000 клиентов, каждый клиент которого последовательно связывается с сервером двунаправленно с помощью командная система. Сервер получит команду и выполнит либо одну (или многие) задачи в соответствии с командой. Мой вопрос заключается в том, как правильно использовать конструкторы Threading.NET для различных ситуаций, выполняя задачи, которые могут занимать от одной минуты до нескольких часов, в зависимости от выполняемой работы.
Что меня больше всего сбивает с толку, так это то, что везде, где я читаю, я вижу нечто вроде "использовать созданный вручную Thread (или собственный пул потоков) для обработки" длительных "задач и использовать TPL для краткосрочных задач, или задачи, требующие параллельной обработки". Что такое долгосрочная задача? Это 5 секунд, 60 секунд, час?
С какими временными рамками я должен использовать каждый из этих трех методов создания потоков:
- Созданные вручную темы
- Класс .NET ThreadPool
- TPL
Еще одна проблема, о которой я подумал, заключается в следующем: скажем, на моем сервере есть 20 000 клиентов, каждая из которых отправляет 1 команду (которая может переводить на одну или несколько задач) в секунду. Даже с мощным аппаратным обеспечением, нет ли шанса, что я мог бы слишком сильно загружать рабочую нагрузку в любую очередь пула потоков/рабочих элементов, которые у меня есть, тем самым, в результате генерируя исключение OutOfMemoryException после того, как очередь будет медленно заполняться до максимума?
Любое понимание будет принята с благодарностью.