我需要一些建議來構建一個同時處理多個客戶端的Java服務器。客戶需要保持相當長時間的連接。我目前正在使用阻塞IO併產生一個線程來讀取連接到服務器的每個客戶端,但顯然這不是可伸縮的。編寫Java服務器來處理多個同時發生的客戶端
我發現了幾個選項,包括使用Selector或Executor和固定大小的線程池。我對任何一個都不太熟悉,所以這裏最好的解決方案是?謝謝!使用多個線程的
我需要一些建議來構建一個同時處理多個客戶端的Java服務器。客戶需要保持相當長時間的連接。我目前正在使用阻塞IO併產生一個線程來讀取連接到服務器的每個客戶端,但顯然這不是可伸縮的。編寫Java服務器來處理多個同時發生的客戶端
我發現了幾個選項,包括使用Selector或Executor和固定大小的線程池。我對任何一個都不太熟悉,所以這裏最好的解決方案是?謝謝!使用多個線程的
這取決於您的可擴展性的定義。您所描述的每個連接使用單個線程的系統可擴展到數百個甚至可能有幾千個併發連接,但它在某個時刻會遇到困難。
您的問題表明您的客戶端連接並保持連接一段時間,可能有一個IO線程來處理讀取和寫入,但將請求處理調度到另一個線程使用執行者。
有些框架/服務器已經被編寫來處理這種事件驅動設計。看看:
值得注意的是,這個世界充滿了失敗的初創公司&有r可擴展的架構。縮放是一個很好的問題,最好是有問題而不是沒有客戶。
是可伸縮的。 Apache例如這樣做,並且一些使用它的站點可以獲得很多訪問者。然而,另一種方法確實會使用選擇器,儘管我沒有使用它的經驗。
畢竟,這似乎是一個問題,哪個宗教是最好的。
有這樣的工作的很多框架,例子
獨立的可擴展性的每個服務器應用程序有它的侷限性。通過使用阻塞IO,您的限制之一將是虛擬機可以派生的線程數,因爲您採用的方法是「每線程一個線程」。使用NIO(其中Selector是其中一個類),該方法是「每個請求一個線程」,這將在後者中耗盡線程。
您的應用的水平可伸縮性(http://en.wikipedia.org/wiki/Scalability#Scale_horizontally_vs._vertically)將不依賴於這些選擇。
你爲什麼說你的解決方案不可擴展?你期望有多少同時發生的客戶? – 2011-04-10 20:53:49
我想我低估了產生大量線程的性能。感謝大家的幫助! – garsh0p 2011-04-10 21:45:52