Проблема заключается в том, что традиционные веб-серверы используют подход «поток за сокетом» для обработки одновременных пользователей, что не всегда оптимально для методов комет / длинных опросов.(Однако в более новых версиях IIS есть способ подключения ваших собственных обработчиков соединений, о которых я расскажу ниже.)
Для традиционных веб-серверов чаще всего цель состоит в том, чтобы получить соединение, обслуживать пользователя.как можно быстрее, и перейдите к следующему соединению.Если соединение задерживается на долгое время, то это потому, что оно, вероятно, выполняет что-то интенсивное, например, большую загрузку или большой запрос, но в целом активно использует ЦП, поэтому многопоточная модель работает довольно хорошо.
В комете (длительный опрос) обычно вы подключаетесь к веб-серверу, где вы просто ждете, когда произойдет событие, и чаще всего нет.Это способствует более одновременным соединениям.Также можно сказать, что многие из этих пользователей ожидают одних и тех же событий, происходящих по всем направлениям.
Выделение потока, тогда для пользователя, в первую очередь, просто вращение и ожидание, не очень оптимальная модель для такого типа вещей.Лучшей моделью является веб-сервер, основанный на цикле событий, который выполняет все асинхронным образом, и когда отправка события нескольким пользователям не требует дорогостоящего переключения контекста для каждого клиента.Это то, на чем построен Node.js (с использованием libevent в качестве его ядра), а также Ruby Eventmachine, Twisted Python, Tornado от Friendfeed, Jetty и сервер Manos на основе C #.
Именно поэтому часто бывает выгоднее, чтобы комета выполняла на своем собственном процессе пользовательский сервер, поскольку традиционные веб-серверы, такие как Apache и более старые версии IIS, не функционируют в зависимости от потребностей Comet.
Стандартные приложения ASP.NET немного испорчены, потому что пул потоков в .NET ограничен 25 общими потоками и 25 потоками ввода-вывода (а соединения http принимают поток ввода-вывода).Вы можете быть фактически ограничены, чтобы быть немного меньше, чем в реальности, потому что пул потоков используется совместно со всеми другими вещами в .NET.Однако вы можете увеличить пул потоков с помощью параметра конфигурации, но производительность имеет тенденцию экспоненциально снижаться при увеличении количества потоков, которые вы добавляете. Теоретически вы можете увеличить это число, если можете гарантировать, что вы не будете сильно расти, изатем, возможно, просто используйте стандартные потоковые мониторы в .NET для создания своей собственной системы диспетчеризации событий кометы.
Однако приложения .NET, работающие с более новыми версиями IIS, все же имеют луч надежды.Вы можете создать пользовательский IAsyncHttpHandler .В Интернете есть несколько отличных руководств, которые вы можете прочитать о том, как это работает.Благодаря этому вы можете создать свой собственный пул соединений и более эффективно обслуживать своих клиентов.Это не идеальное решение, и вам придется самостоятельно строить много сантехники. WebSync - это коммерческий продукт, который обертывает этот интерфейс для вас и дает вам некоторые компоненты инфраструктуры высокого уровня, с которыми вы можете работать.