2011-07-21 32 views
1

我想問一下開發類似於SmartFoxServer的服務器時選擇什麼更合適。我打算開發一個類似但又不同的服務器。在開發上述服務器的基準測試中,他們擁有10000個併發客戶端。 我對使用太多線程(> 500)的成本進行了一些研究,但無法決定走哪條路。我曾經在java中製作過一個服務器,但那是一個小應用程序,並且與重負載無關。艱難時刻選擇... IO vs NIO

謝謝

+0

關於此主題已經有很多問題了:http://stackoverflow.com/questions/tagged/nio?sort=votes&pagesize=50 – TheLQ

+0

我對故事的看法是:如果你不得不問,那就是IO。雖然NIO並不像大多數人所說的那麼困難,但有效地使用它通常意味着您知道它是如何實際執行的,這是有點警告的。常規IO傾向於多次複製緩衝區,並且所有緩衝流也不會幫助解決問題。注意:如果你打算在單個盒子上使用10k連接,協議本身可能非常重要(像json這樣的東西不是你想要的)。 – bestsss

回答

2

看看Apache Mina。他們做了很多在網絡應用程序中有效使用NIO所需的繁重工作。 NIO是否提高了處理併發連接的能力取決於你的實現,但Tomcat,JBoss和Jetty的性能提升對你來說已經是充分的證據了。

1

我不熟悉smartfoxserver,所以我只能說一般(這並不總是好的:P,但在這裏,我去)

我認爲這些是2點不同的問題。一方面,當使用原生Java套接字與用c編寫的本地套接字(如tomcat)時的io性能。

另一個問題是如何擴展到這種併發級別。除此之外,我總是選擇本地套接字(即:c)。如何擴展:有很多線程同時運行(操作系統約束等)並不是一個好主意,所以我會選擇水平擴展,意思是添加一個負載平衡器,它可以將請求發送到可以使用消息鏈接的不同服務器(使用jms,比如rabbitmq或activemq,或者甚至使用stomp或amqp協議)。

其他的解決方案,雲計算環境,使您可以根據您的需要

1

在大部分測試,其測試10K或100K連接,增加你的安裝,服務器正在做沒有工作,除非您的服務器不微乎其微,這些測試是不現實的。

您需要清楚您想要支持的許多併發連接。

如果連接少於1K,則每個連接使用一個線程將可以正常工作。這是最簡單的方法。如果您的請求非常簡單,對NIO使用調度程序模型將會更好。否則,它並不重要。

如果你有1K多的連接很可能要使用多臺服務器爲每個連接越來越核心的不到1%,並基本服務器的成本也相對便宜,這些天。

+0

那麼這個想法是儘可能從一臺服務器獲得可能的水平擴展系統。我認爲使用線程會更好。 –

+0

使用線程可能不像調度器模型那樣具有可伸縮性,但它會簡單得多,而且通常情況下會更好。如果您爲每個輸入/請求所做的工作不重要,則不會影響性能。 –