问题是传统的 Web 服务器使用每个套接字线程的方法来处理并发用户,这对于彗星/长轮询技术并不总是最佳的。(但是,较新版本的 IIS 可以插入您自己的连接处理程序,我将在下面介绍。)
对于传统的 Web 服务器,更多的目标是获得连接,尽快为用户提供服务,然后移动到下一个连接。如果一个连接持续了很长时间,那是因为它可能在做一些密集的事情,比如一个大的下载或巨大的查询,但总的来说它积极地使用 CPU,所以线程模型工作得很好。
在彗星(长轮询)中,通常您连接到一个 Web 服务器,您只需等待事件发生,而且通常情况下。这促进了更多的并发连接。此外,这些用户中的许多人都在等待相同的事件全面发生。
然后为用户分配一个线程主要只是旋转和等待对于这种类型的事情来说并不是一个非常理想的模型。更好的模型是基于事件循环的 Web 服务器,它以异步方式执行所有操作,并且将事件分派给多个用户并不涉及为每个客户端进行代价高昂的上下文切换。这是 Node.js 的构建基础(使用 libevent 作为其核心),以及 Ruby Eventmachine、Twisted Python、Friendfeed 的 Tornado、Jetty 和基于 C# 的Manos服务器。
这就是为什么在 Comet 自己的进程上定制自定义服务器通常更有利的原因,因为传统的 Web 服务器(如 Apache 和旧版本的 IIS)不能有效地满足 Comet 的需求。
标准 ASP.NET 应用程序有点搞砸了,因为 .NET 中的线程池被限制为 25 个通用线程和 25 个 IO 线程(并且 http 连接需要一个 IO 线程)。由于线程池与 .NET 中的所有其他事物共享,因此您可能会被有效地限制为略低于实际情况。但是,您可以通过配置设置来提高线程池,但是性能倾向于随着您投入的线程越多而呈指数下降。如果您能保证不会增长太多,理论上您可以提高这个数字,并且然后可能只使用 .NET 中的标准线程监视器来构建您自己的彗星事件调度事物。
不过,运行较新版本 IIS 的 .NET 应用程序确实有一线希望。您可以创建自定义IAsyncHttpHandler。有一些很棒的在线指南供您阅读它是如何工作的。有了它,您可以建立自己的连接池并更有效地为您的客户服务。这不是一个完美的解决方案,您必须自己构建大量管道。WebSync是一个商业产品,它为您包装了这个界面,并为您提供了一些您可以使用的高级框架部分。