2012-04-03 123 views
5

我正在通過這個關於長輪詢的Question,除了提供解決方案之外,關於Apache處理大量請求的低效性已經提出了一個有趣的觀點。我對Apache Tomcat有同樣的關注?Apache Tomcat的長輪詢效率如何?

Apache Tomcat是否足夠有效地處理長輪詢。我知道Apache Tomcat支持相當多的併發線程的一件事,但它被縮放到這樣一個限制,我們可以用上面提到的線程解釋的方式將它用於長輪詢?

+0

在我看來,我更喜歡用信號量(旋轉鎖)的短輪詢方法來儘可能處理這種類型的服務。如果您可以犧牲幾百毫秒(最糟糕的情況下,通常只有幾十毫秒)的準確性,您可以享受到能夠支持更多併發用戶的好處。 – 2012-04-03 00:15:40

+0

@TravisJ是其中一個選擇,但目標是實現Facebook的功能,其中我們有實時更新,我們可以從Facebook看到客戶端總是提出請求。 – 2012-04-03 01:49:24

+0

Facebook的哪個部分?並非所有的臉書都是直播內容。你的意思是在線聊天嗎? – 2012-04-03 07:22:01

回答

5

你指的是在question此評論,

像Apache一個普通的Web服務器上運行,這將迅速佔用所有的「工作線程」和
離開它不能對其他迴應請求

最近版本的apache tomcat支持comet它允許非阻塞IO允許tomcat擴展爲大量的請求。從這個article

由於在Java中4的新 我介紹了非阻塞I/O能力/ O API的Java平臺(NIO)包,一個持久的HTTP 連接不要求一線程不斷附加到它。 僅當處理請求時,線程纔可以分配給連接 。當連接在請求之間空閒時,線程可以循環使用 ,並將連接置於集中式NIO select 集合中,以檢測新請求而不消耗單獨的線程。這種 模型(稱爲每個請求的線程)可能允許Web服務器使用 線程處理數量不斷增加的用戶連接。使用相同的硬件配置,運行在 中的Web服務器比使用線程連接模式要好得多。今天,流行的Web服務器 - 包括Tomcat,Jetty,GlassFish (Grizzly),WebLogic和WebSphere - 都通過Java NIO使用每個請求的線程 。

+0

「集中NIO選擇集」是什麼意思? – John 2015-08-09 13:32:20

2

看到這個report comparing Tomcat and Jetty for Comet

  • 的Tomcat往往有當有一些非常忙碌的連接性能稍好。它在請求延遲方面略有優勢,當很多請求/響應通過幾個連接發送而沒有任何顯着的空閒時間時,這是最明顯的。

  • 當大量空閒時間存在多個連接時,Jetty往往具有更好的可擴展性,這與大多數Web站點的情況一樣。 Jetty的小內存佔用量和NIO使用率提高了每個可用內存的用戶數量。此外,更小的佔用空間意味着更少的內存和CPU緩存被servlet容器消耗,並且有更多的緩存可用於加速非平凡應用程序的執行。

  • Jetty在提供靜態內容方面也有更好的性能,因爲Jetty能夠使用預先內存映射文件緩衝區與NIO集合寫入相結合來指示操作系統以最大DMA速度發送文件內容,而無需輸入用戶內存空間或JVM。

如果你的應用程序將在有空閒連接或誰只是等待服務器的響應客戶段,然後碼頭將在Tomcat的一個更好的選擇。一個例子將包括股票市場報價,其中客戶發送很少的請求,只是在等待更新。

此外,Jetty團隊是Comet的開拓者,我發現的大多數信息和示例都傾向於專注於Jetty。自2008年以來,我們一直在Comet服務器上使用Jetty,並對結果感到滿意。

需要考慮的另一件事是Jetty被設計爲獨立的Web服務器。這意味着你不需要在Jetty前面安裝Apache服務器。我們在端口80上運行Jetty standalone以滿足我們所有應用程序的請求,包括Comet請求。

如果您使用Tomcat進行慧星請求,您很可能需要允許直接訪問端口8080並繞過Apache,因爲Apache可能會否定您的長輪詢。