2012-10-20 38 views
-1

我一直在努力爲Java NIO,還是老的Java I之間選擇,同時/ O阻塞插槽,對於服務器我正在開發。的Java NIO或Java IO高性能服務器

我在想的Java NIO效果會更好,因爲這將有一個非常大的客戶端,而客戶端將保持連接,這樣服務器可以時可用推送數據。

所以這讓我認爲Java阻塞I/O將是矯枉過正,因爲線程數會很高。

對於這種情況,您有何看法?

+1

你有沒有試過[netty](https://netty.io/)? –

+2

我會使用一個* existing *框架 - 不要直接使用NIO,它是一個PITA,很難「正確」 - 至少使用像XNIO這樣的包裝器,儘管也許更高層次的抽象是一個開始(例如消息框架或Tomasz提到的事件驅動服務器)。對我而言,NIO的一大優勢並不在於「減少線程」,而在於「降低併發」 - 也就是說,它需要我通過在線程之間建立單個交叉點來減少併發問題。 – 2012-10-20 18:50:52

+0

大量連接意味着什麼? 100,1000,10000或100,000個服務器。您的解決方案將取決於您的確切要求。沒有更多的細節,我會認爲更簡單的解決方案是最好的。 –

回答

1

你只會有話單信息到客戶端推送預計將花費很長時間阻塞I/O問題。只連接客戶端不需要每個客戶端有一個線程。事實上,我現在正在編寫這樣一個軟件。您只需要儘可能多的線程,因爲在某個特定的時間點併發消息需要按下。這通常不會很高。考慮推送消息所需的時間與等待消息到達時間的比率。將同時使用的客戶端數量與此數量相乘,得到平均活動線程數。

你會維護一套所有打開的輸出流,每一個客戶端。他們只是坐在記憶裏,直到消息到達需要推送給客戶。那時你需要一個線程來處理那條消息。如果在推送消息時想要處理另一個事件並將消息推送到另一個客戶端,則需要第二個線程,但只要第一次推送完成,該線程就會返回到可用池線程。

我也可以告訴演員模型實現協調的消息推動。演員模型完全匹配這個問題。