gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:45:04 28 4
gpt4 key购买 nike

对于需要维护活跃用户列表的可扩展服务器,最佳实践是什么?

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

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

最佳答案

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

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

我不会让客户端轮询服务器。这是低效的。让服务器在有可用数据时向客户端发布数据。这将允许服务器通过让服务器决定将数据发送给客户端的频率来在某种程度上控制工作负载——它可以在每次有新数据可供客户端使用时发送,也可以在它对一些数据进行批处理并等待片刻后发送while, etc. 如果服务器正在推送数据,那么服务器(薄弱点,可能会被客户端需求淹没的地方)可以更好地控制它需要做的工作。

如果每个客户端都进行轮询,那么 a) 当每个客户端发送一条消息询问服务器是否有任何应该发送的消息时,您会产生更多的网络噪音,并且 b) 您会为服务器产生更多的工作因为它需要对民意调查做出回应。服务器知道什么时候有客户端的数据,让它负责告诉客户端。

关于tcp - 聊天服务器 - 每个轮询的持久 TCP 或新连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3818189/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com