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

时间:2010-09-29 01:32:18

标签: tcp connection scalability

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

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

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

1 个答案:

答案 0 :(得分:4)

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

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

我不会让客户端轮询服务器。效率低下。让服务器在有可用数据时将数据发布到客户端。这将允许服务器通过让它决定将数据发送到客户端的频率来稍微控制工作负载 - 它可以在每次为客户端提供新数据时发送,也可以在它批量处理一些数据并等待一小段时间后发送如果服务器正在推送数据,那么服务器(弱点,可能被客户需求淹没的地方)可以更好地控制它需要做的工作。

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