聊天服务器-每次轮询的持久TCP或新连接

1 connection tcp scalability

需要维护活动用户列表的可伸缩服务器的最佳实践是什么?

  • 我应该为服务器在其上发送更新消息的每个客户端打开持久的TCP连接吗?这可能导致许多打开的连接,并且可能导致许多秒钟内没有流量。这是TCP中的问题吗?
  • 还是让客户端定期轮询更新(每个更新都有一个新的tcp连接)会更好吗?

聊天服务器或大型在线游戏如何处理?

Len*_*ate 5

就我个人而言,我会为每个客户端建立一个单一的持久TCP连接,以避免a)创建和销毁连接的额外工作以及所有涉及的TCP数据包所涉及的额外延迟,以及b)避免在TIME_WAIT上的任何一个上创建大量套接字客户端或服务器。根本没有充分的理由来创建和销毁连接。

取决于您的平台,可能有各种技巧来解决在打开大量连接时可能遇到的各种特定于平台的问题,而我指的是成千上万。例如,在Windows上,对许多连接使用重叠的I / O和I / O完成端口将是一个不错的设计,并且如果您的连接通常在大多数时间处于空闲状态,则可能会发现使用“零字节读取”技巧将允许您在较少的硬件上处理更多的连接;但这是您可以添加的内容,一旦您知道自己有问题,这是因为等待读取的缓冲区空间量很少,而这很少完成。

我不会让客户端轮询服务器。效率低下。当有可用数据时,让服务器将数据发布到客户端。这样一来,服务器可以让服务器决定将数据发送到客户端的频率,从而在某种程度上控制工作负载-它既可以在每次有新数据可供客户端使用时发送,也可以在批处理一些数据并等待一小段时间后发送如果服务器正在推送数据,则服务器(弱点,可能会因客户需求而淹没的地方)可以更好地控制所需要做的工作。

如果您让每个客户端都进行轮询,则a)您正在生成更多的网络噪音,因为每个客户端都会发送一条消息来询问服务器是否有应发送的消息; b)您需要为服务器生成更多的工作回应民意调查。服务器知道何时有客户端数据,让它负责告知客户端。

  • 同意。IRC 服务器维护与每个客户端的持久 TCP 连接,并且已知这些服务器可以同时处理超过 100,000 个客户端。 (2认同)