需要维护活动用户列表的可伸缩服务器的最佳实践是什么?
。
聊天服务器或大型在线游戏如何处理这个问题?
发布于 2010-09-29 06:51:18
就我个人而言,我会选择每个客户端一个持久TCP连接,以避免( a)创建和销毁连接的额外工作以及所有涉及的TCP数据包所涉及的额外延迟;( b)避免在客户机或服务器上在TIME_WAIT中创建大量套接字。根本没有什么好的理由去创建和破坏这些连接。
根据您的平台,可能有不同的技巧来处理各种特定于平台的问题,当您打开大量连接时,您可能会遇到这些问题。例如,在Windows上,使用重叠的I/O和I/O完成端口对于很多连接来说都是一个很好的设计,如果您的连接大部分时间都处于空闲状态,那么您可能会发现,使用“零字节读取”技巧将允许您在较小的硬件上处理更多的连接;但是,一旦您知道由于等待读取的缓冲区空间太大而导致问题,这是可以添加的。
我不会让客户在服务器上轮询。效率很低。让服务器在有可用数据时将数据发布到客户端。这将允许服务器在某种程度上控制工作负载,方法是让它决定将数据发送到客户端的频率--它可以在每次为客户端提供新数据时发送数据,或者在将一些数据批量处理并等待一段时间之后发送,等等。如果服务器正在推送数据,那么服务器(可能会被客户需求淹没的地方)对它需要做的工作有更多的控制权。
如果您有每个客户端轮询,那么就会产生更多的网络噪音,因为每个客户端都会发送一条消息,询问服务器是否有它应该发送的内容;( b)您正在为服务器生成更多的工作,因为它需要响应投票。服务器知道什么时候有客户端的数据,让它负责告诉客户端。
https://stackoverflow.com/questions/3818189
复制相似问题