2010-09-29 100 views
0

對於需要維護活動用戶列表的可伸縮服務器,最佳做法是什麼?聊天服務器 - 持續TCP或每個輪詢的新連接

  • 我應該爲服務器發送更新消息的每個客戶端打開持久的TCP連接嗎? 這可能導致許多開放的連接,並在幾秒鐘內沒有交通。這是TCP中的問題嗎?
  • 或者讓客戶端定期輪詢更新(每個都有一個新的tcp連接)會更好嗎?

如何聊天服務器或大型在線遊戲處理呢?

回答

4

就個人而言,我會爲每個客戶端提供單個持久性TCP連接,以避免a)創建和銷燬連接以及所涉及的所有TCP數據包中涉及的額外延遲的額外工作,以及b)避免在其中創建大量套接字TIME_WAIT在客戶端或服務器上。沒有很好的理由來創建和銷燬連接。

根據您的平臺上可能有不同的招數來對付,當你有大量的連接開放的,你可能會得到不同的平臺的具體問題,並通過大量的我的意思是成千上萬10S。例如,在Windows上,使用重疊的I/O和I/O完成端口對於大量連接來說是一個很好的設計,並且如果大多數情況下您的連接通常處於空閒狀態,那麼您可能會發現使用「零字節讀取」技巧將允許您在較小的硬件上處理更多的連接;但是一旦您知道自己遇到問題,就可以添加它,因爲您需要等待讀取的緩衝區空間量纔會很少完成。

我不會讓客戶端輪詢服務器。效率不高。在存在可用數據時,讓服務器將數據發佈到客戶端。這將允許服務器通過讓它決定將數據發送到客戶端的頻率來控制工作量 - 它可以在客戶端每次有新數據可用時發送,或者在批量處理一些數據並等待一小段時間後發送同時等。如果服務器正在推送數據,那麼服務器(弱點,可能會被客戶需求淹沒的地方)對其需要完成的工作有更多的控制權。

如果每個客戶端輪詢再)爲每個客戶端發送消息詢問服務器是否有什麼關係,它應該把它和b)你產生了更多的工作,你產生更多的網絡噪音服務器,因爲它需要響應投票。服務器知道什麼時候有客戶的數據,讓它負責告訴客戶。

+0

同意。 IRC服務器與每個客戶端保持持久的TCP連接,並且這些服務器可以處理超過100,000個同時發生的客戶端。 – caf 2010-09-30 06:38:40