Apache Tomcat对长轮询的效率如何?

时间:2012-04-03 00:06:16

标签: tomcat long-polling

我正在通过这个Question关于长轮询,除了提供解决方案之外,还有一个关于Apache处理大量请求的低效率的有趣观点。我对Apache Tomcat有同样的担忧吗?

Apache Tomcat是否足以处理长轮询。我知道Apache Tomcat支持相当大量的并发线程,但它是否已经缩放到这样的限制,我们可以像上面提到的线程解释的那样将它用于Long Polling?

2 个答案:

答案 0 :(得分:5)

您是指question上的评论,

  

在像Apache这样的常规Web服务器上运行它会很快占用所有“工作线程”和
  让它无法回应其他请求

最新版本的apache tomcat支持comet,允许非阻塞IO允许tomcat扩展到大量请求。从此article

  

感谢Java 4的New中引入的非阻塞I / O功能   Java平台(NIO)包的I / O API,一个持久的HTTP   连接不要求线程始终连接到它。   只有在请求出现时才能将线程分配给连接   处理。当请求之间的连接空闲时,线程可以   被回收,连接被置于集中的NIO选择中   设置为检测新请求而不消耗单独的线程。这个   模型,每个请求称为线程,可能允许Web服务器   处理越来越多的固定数量的用户连接   线程。使用相同的硬件配置,运行的Web服务器   此模式比每线程连接模式更好地扩展。   今天,流行的Web服务器 - 包括Tomcat,Jetty,GlassFish   (Grizzly),WebLogic和WebSphere--每个请求都使用线程   通过Java NIO。

答案 1 :(得分:2)

请参阅此report comparing Tomcat and Jetty for Comet

  
      
  • 当几乎没有非常繁忙的连接时,Tomcat往往会有稍微好一点的性能。它在请求延迟方面略有优势,当很多请求/响应通过几个连接发送而没有任何显着的空闲时间时,这是最明显的。

  •   
  • 当存在大量空闲时间的连接时,Jetty往往具有更好的可扩展性,大多数网站的情况也是如此。 Jetty的小内存占用和高级NIO使用允许每单位可用内存拥有更多用户。此外,占用空间越小意味着servlet容器将消耗更少的内存和CPU缓存,并且可以使用更多缓存来加速执行非平凡的应用程序。

  •   
  • Jetty在提供静态内容方面也有更好的性能,因为Jetty能够使用高级内存映射文件缓冲区结合NIO收集写入来指示操作系统以最大DMA速度发送文件内容而无需输入用户内存空间或JVM。

  •   

如果你的应用程序有空闲连接的时段或者只是等待来自服务器的响应的客户端,那么Jetty将是比Tomcat更好的选择。一个例子包括股票市场代码,客户端发送的请求很少,只是在等待更新。

此外,Jetty团队是Comet的先驱,我发现的大多数信息和示例都倾向于仅关注Jetty。自2008年以来,我们在Comet服务器上使用了Jetty,并对结果感到满意。

另一件需要考虑的事情是Jetty被设计为独立的Web服务器。这意味着您不需要在Jetty前面安装Apache服务器。我们在端口80上独立运行Jetty,以满足我们所有应用程序的请求,包括Comet请求。

如果您使用Tomcat进行彗星请求,您很可能需要允许直接访问端口8080并绕过Apache,因为Apache可能会否定您的长轮询。