2011-11-24 68 views
2

我是Java新手NIO.I有一點疑問。如果我使用NIO而不是套接字客戶端,服務器是否也使用NIO或者它沒有關係?服務器和客戶端都支持Java NIO嗎?

我關心應用程序的可伸縮性。我正在查看每臺服務器每秒約500-1000個客戶端請求。由於我會將數據發送到至少三臺不同的服務器,因此我理想的情況是每秒鐘處理大約1500個客戶端請求。爲此,我已經有了一個實現了相當體面的工作的套接字池實現。

我所擁有的是插座的連接池,每個線程server.Each拿起從池中的可用套接字連接,並將其發送給服務器

我試圖找出是否NIO可以幫助或者是比套接字客戶端更好。 如何阻止?普通客戶端會阻塞或超時。

+1

NIO不是在服務器上比在客戶端更有利嗎?我不明白爲什麼它是客戶端而不是服務器中的要求? – jgauffin

+1

@jgauffin我只關心客戶端。服務器是我通過TCP發送數據的第三方應用程序。我只打算最大限度地提高我的客戶的表現。我正在考慮我的選擇。那麼使用NIO作爲客戶端還是普通套接字客戶端是一個好主意? – Dunxton

+2

imho您將無法通過使用NIO從客戶端獲得更多性能。瓶頸將是服務器或網絡。此外,NIO更復雜,並且很可能會出現會損害性能的錯誤。保持簡單並完成您的應用程序。 – jgauffin

回答

4

沒關係。 TCP流不受您選擇的NIO影響。

+0

+1:事實上,您的客戶端或服務器可以是C或PHP或您從未聽說過的某個平臺。這同樣適用於Java 7中的NIO2。 –

2

恕我直言,你不會通過使用NIO獲得更多的性能。瓶頸將是服務器或網絡。此外,NIO更復雜,並且很可能會出現會損害性能的錯誤。

我會先做一個套接字實現來讓它更快地運行起來。如果您遵循一些常見模式/原則(如單一責任原則),稍後可以輕鬆切換實施(如果您或您的用戶已證明您的應用程序性能是我認爲極不可能的瓶頸)。

更新

什麼NIO或任何其他異步框架它讓多業務共享同一線程。每個連接在處理大量連接時都有一個線程會浪費資源,因爲所有線程都不會始終處於活動狀態。

如果您只有幾個連接,對於客戶端使用NIO不會給您帶來任何好處。每個連接擁有一個線程+套接字不會佔用太多資源,並且處理連接將會更容易。

+0

當您說'如果您只有幾個連接,則將NIO用於客戶端不會給您帶來任何好處。 '那麼NIO會在什麼情況下有用?在我的實現中,我會說,在一個池中有50個套接字連接,每秒使用/重用500個線程。所以我沒有每個線程模型的連接。 – Dunxton

+0

有500個線程?那些線程在做什麼?你使用的是linux/osx還是windows? – jgauffin

+0

我使用Windows Server 2008 64位。簡單來說,我的應用就像一座橋樑。它每秒獲得500個Web服務請求。爲每個Web服務請求創建一個線程,其任務是通過tcp將請求傳輸到目標。如果我必須將它發送到3個目標,則每個請求將創建3個線程。 – Dunxton