Можно ли использовать AsyncController в ASP.NET MVC для обслуживания большого количества одновременных запросов на зависание (длинный опрос)?

Фреймворки, такие как Node.js, Tornado и Twisted, позволяют разработчикам создавать серверные приложения, которые поддерживают большое количество одновременных запросов на зависание (10 000+). Насколько я понимаю, все они достигают этого, не создавая потоков для обслуживания каждого зависшего запроса.

Можно ли использовать AsyncController для обслуживания большого количества неактивных одновременных запросов?

Если да, существуют ли достаточно большие веб-сайты ASP.NET MVC, использующие этот подход для создания приложений с длительным опросом?

2 ответа

Решение

Недавно я написал простой пример сервера длинных опросов с использованием асинхронных контроллеров MVC 3, основанный на замечательной статье Клэя Ленхарта, но у меня не было возможности по-настоящему протестировать его с кучей соединений.

Вы можете использовать пример развертывания AppHarbor, который я настроил на основе источника из проекта BitBucket.

Кроме того, больше информации доступно из моего поста в блоге, объясняющего проект.

AsyncController полезен (по сравнению с обычным контроллером) в следующей ситуации:

У вас долго выполняемая задача, и эта задача обычно достигается с помощью другого уровня (веб-службы, базы данных и т. Д.) С помощью портов завершения ввода / вывода. Таким образом, запрос запускается в рабочем потоке, затем вы вызываете метод BeginXXX, который открывает IOCP (если он поддерживает его, если не бесполезен, так как он просто рисует другой рабочий поток), и рабочий поток будет немедленно возвращен в пул потоков. Во время выполнения длинной операции никакие рабочие потоки не используются на сервере. Как только он завершает это, он сигнализирует IOCP, асинхронный контроллер извлекает другой поток из пула, чтобы просто завершить запрос и вернуть результаты в представление. Здесь следует отметить несколько вещей: тот факт, что вы использовали асинхронный контроллер вместо обычного контроллера, не имеет абсолютно никакого значения для клиента: ему все равно придется ждать столько же времени для завершения запроса, не Получите ложное впечатление, что асинхронный контроллер сделает вашу медленную работу быстрее. Просто рабочие потоки будут монополизированы за меньшее время и, следовательно, могут ускорить выполнение других запросов.

Подводя итог: для быстро выполняющихся запросов асинхронные контроллеры не принесут вам никакой пользы по сравнению с обычными контроллерами. Для медленных запросов они могут, но это будет зависеть от характера длительной работы и от того, связан ли он с процессором или с вводом / выводом. Для задач, связанных с процессором, асинхронные контроллеры также не являются более полезными. Но во всех случаях вы должны выполнять обширное нагрузочное тестирование своего приложения.

Вот очень хорошая статья о MSDN, которая объясняет асинхронные запросы в ASP.NET.

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

Другие вопросы по тегам