2010-07-31 123 views
1

我對網絡編程相當陌生,目前我正在爲移動應用程序開發網絡後端。目前,我有用戶使用servlet交互進行登錄,並且一旦他們具有對應用程序的完全訪問權限,我需要打開一個套接字連接,以便我可以提供服務器推送。現在我遇到的問題是人們如何處理數千個併發套接字連接。我遇到過討論ThreadPools的人,這看起來很容易實現和NIO。有沒有我可以使用的框架來確保我的服務器至少處理20-30k併發連接。我也可以忘記TCP連接並進行長輪詢,但從我的理解來看,TCP是資源明智的最佳選擇。Socket編程,Java,Tomcat 6,Scaling

@Steve - 我正在看前者:一個擁有數千個連接的服務器端口。

+0

長時間輪詢發生在......打開的TCP連接上。 :) – 2010-07-31 20:03:25

+0

您是否正在查看一個具有一千個TCP連接的服務器進程或一個具有TCP連接的一千個服務器進程? – 2010-07-31 20:20:18

+0

它是單向套接字還是您打算在這些套接字上接收數據? – 2010-07-31 20:53:56

回答

2

我會立即研究網絡結束聚類,並將其用作主要縮放機制。 30k連接相當多,在達到某種服務器限制之前,您沒有太多的增長空間。如果I/O本身不是繁重的話,我只會使用大量的線程和服務器,這些線程和服務器有很多的馬力和內存。讓它能夠以這種方式工作,這樣你就可以發佈並有一個後備計劃,在性能或擴展成爲問題時切換到多路複用NIO,但要警告這是一次徹底的檢修,而且要比java.net編程複雜十倍。經過幾年的考慮,我越來越想知道NIO是否真的值得這麼做:它增加了一些自己的新問題,例如需要推送解析;如果存在需要更改通道註冊狀態的工作線程,則會與選擇器發生同步問題;很多方法讓代碼錯誤;以及調度開銷從操作系統移出到您的應用程序中的情況,您只有線性集迭代器數據結構才能處理它,除非您進入另一個級別的複雜性。值得注意的是,select()是爲Unix開發的,可以節省昂貴的進程。線程真的非常便宜,並且提供了一個非常簡單的編程模型,內置上下文來處理單個連接。除了通過嚴格使用選擇密鑰附件,NIO幾乎不管理這一點,更不自然。