2010-09-29 102 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