【问题标题】:Chat Server - persistent TCP or new Connection for each poll聊天服务器 - 每次轮询的持久 TCP 或新连接
【发布时间】:2010-09-29 01:32:17
【问题描述】:

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

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

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

【问题讨论】:

    标签: tcp connection scalability


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 同意。 IRC 服务器维护与每个客户端的持久 TCP 连接,并且已知这些服务器可以同时处理超过 100,000 个客户端。
    猜你喜欢
    • 2012-07-30
    • 1970-01-01
    • 1970-01-01
    • 2014-09-12
    • 1970-01-01
    • 1970-01-01
    • 2014-02-07
    • 2012-11-27
    • 1970-01-01
    相关资源
    最近更新 更多