Существует множество ответов на вопрос, КАК ограничить параллелизм асинхронных операций ввода-вывода и / или их продолжений - с помощью пользовательского планировщика, SemaphorSlim и т. Д. Мой вопрос: имеет ли смысл делать это в стандартном сценарии ASP.NET MVC / WebAPI?
У нас есть типичный корпоративный API, который служит бэкендом для ориентированного на клиента SPA. Многие запросы API включают вызов десятков нисходящих веб-сервисов, которые мы в настоящее время в основном преобразовали в асинхронный ввод-вывод с помощью TAP (async / await). Многие из этих вызовов удаленной службы запускаются параллельно, без ожидания, а затем ожидаются массово с использованием Task.WhenAll
. Иногда, когда AllAll выполняется для фиксированного числа задач, а иногда мы запускаем удаленный вызов для элемента в коллекции - что приводит к появлению неизвестного (но обычно небольшого, менее дюжины) количества задач и затем ожидания их с WhenAll.
Как я понимаю , это заставляет продолжения этих задач (то есть логику, которая десериализует их ответы) планироваться в ThreadPool. Это приводит к моему вопросу: не приведет ли параллельное выполнение этих продолжений, связанных с процессором, к чрезмерному давлению на ThreadPool? Должны ли мы разрабатывать какое-то промежуточное программное обеспечение, которое ограничивало бы параллелизм продолжений асинхронных задач ввода-вывода, запускаемых внутри одного запроса, путем планирования их в пользовательском планировщике?
Это позволило бы улучшить масштабируемость нашего приложения, уменьшив количество потоков ThreadPool, выделенных для любого данного запроса, что позволило бы обслуживать более параллельные запросы до того, как мы начнем исчерпывать потоки ThreadPool (или получить удушение) ростом ThreadPool)?
Или это довольно бесполезно, и мы должны просто доверять способности ThreadScheduler + ThreadPool по умолчанию планировать все задачи на доступные ядра ЦП для любого количества одновременных запросов?
К вашему сведению, каждый пытается ответить:
Это довольно зрелая система в очень крупной компании, которую тщательно изучают десятки экспертов (в том числе и я), занимающихся производством в одном штате США, готовящихся к выпуску на национальном уровне. Такие предложения, как «сначала измерить», «узнать, являетесь ли вы IO по сравнению с процессором», «попробовать AppInsights» и «не пытаться быть умнее, чем Microsoft», - это самые первые вещи, о которых мы сами, очевидно, подумали. Уровень руководства, к которому мы стремимся, больше похож на: Кто-нибудь здесь внедрил полностью асинхронную систему ASP.NET Web API на национальном уровне в США и имеет реальный опыт работы с асинхронным / когда выполняется параллелизм?