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

聊天服务器-每次轮询的持久TCP或新连接,tcp,connection,scalability,Tcp,Connection,Scalability,对于需要维护活动用户列表的可扩展服务器,最佳做法是什么 我是否应该为服务器发送更新消息的每个客户端打开一个持久TCP连接? 这可能导致许多开放连接,并且可能在数秒钟内没有流量。这是TCP中的问题吗 或者让客户端定期轮询更新(每个更新一个新的tcp连接)会更好吗 聊天服务器或大型在线游戏如何处理这一问题?就个人而言,我会为每个客户端建立一个持久的TCP连接,以避免a)创建和破坏连接的额外工作以及所有涉及的TCP数据包所涉及的额外延迟;b)避免在等待客户端或服务器。根本没有理由创建和破坏连接 根

对于需要维护活动用户列表的可扩展服务器,最佳做法是什么

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

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

就个人而言,我会为每个客户端建立一个持久的TCP连接,以避免a)创建和破坏连接的额外工作以及所有涉及的TCP数据包所涉及的额外延迟;b)避免在等待客户端或服务器。根本没有理由创建和破坏连接

根据您的平台,可能会有各种技巧来处理各种特定于平台的问题,当您打开大量连接时,可能会遇到这些问题,我指的是成百上千的问题。例如,在Windows上,使用重叠的I/O和I/O完成端口对于大量连接来说是一个很好的设计,如果您的连接通常大部分时间处于空闲状态,那么您可能会发现使用“零字节读取”技巧将允许您在较小的硬件上处理更多连接;但是,当您知道由于等待读取的缓冲区空间太大而出现问题时,您可以添加这些内容,而这些读取很少完成

我不会让客户端轮询服务器。效率很低。当有数据可用时,让服务器向客户端发布数据。这将允许服务器通过决定向客户机发送数据的频率来控制工作负载-它可以在客户机每次有新数据可用时发送,也可以在批量处理一些数据并等待一段时间后发送,等等。如果服务器正在推送数据,则服务器(弱点,可能被客户需求压倒的地方)对需要做的工作有更多的控制权


如果每个客户端都进行轮询,那么a)当每个客户端发送一条消息询问服务器是否有需要发送的内容时,会产生更多的网络噪音;b)当服务器需要响应轮询时,会产生更多的工作。服务器知道客户端何时有数据,让它负责告诉客户端。

就我个人而言,我会为每个客户端建立一个持久的TCP连接,以避免a)创建和破坏连接的额外工作以及所有涉及的TCP数据包所涉及的额外延迟,以及b)避免在等待客户端或客户端时创建大量套接字服务器根本没有理由创建和破坏连接

根据您的平台,可能会有各种技巧来处理各种特定于平台的问题,当您打开大量连接时,可能会遇到这些问题,我指的是成百上千的问题。例如,在Windows上,使用重叠的I/O和I/O完成端口对于大量连接来说是一个很好的设计,如果您的连接通常大部分时间处于空闲状态,那么您可能会发现使用“零字节读取”技巧将允许您在较小的硬件上处理更多连接;但是,当您知道由于等待读取的缓冲区空间太大而出现问题时,您可以添加这些内容,而这些读取很少完成

我不会让客户端轮询服务器。效率很低。当有数据可用时,让服务器向客户端发布数据。这将允许服务器通过决定向客户机发送数据的频率来控制工作负载-它可以在客户机每次有新数据可用时发送,也可以在批量处理一些数据并等待一段时间后发送,等等。如果服务器正在推送数据,则服务器(弱点,可能被客户需求压倒的地方)对需要做的工作有更多的控制权


如果每个客户端都进行轮询,那么a)当每个客户端发送一条消息询问服务器是否有需要发送的内容时,会产生更多的网络噪音;b)当服务器需要响应轮询时,会产生更多的工作。服务器知道客户端何时有数据,让它负责告诉客户端。

同意。IRC服务器与每个客户端保持持久的TCP连接,已知这些服务器可以同时处理100000多个客户端。同意。IRC服务器与每个客户端保持持久的TCP连接,已知这些服务器可以同时处理100000多个客户端。