我对从 ec2 实例运行 tcp 服务器的连接可靠性有疑问。
我们目前使用 c3.4xl ec2 实例为俄勒冈地区的全球移动客户提供服务。我们的产品是一个使用 gevent 框架用 python 编写的实时游戏服务器。目前我们同时为大约 200 - 300 名客户提供服务。
问题是,我们有很多来自世界另一端的客户在连接和保持与服务器的连接时遇到问题。服务器总是让客户端超时而不关闭套接字。我们发现超过 30 秒的时间没有收到心跳回复。
我们假设移动客户端可以从世界各地建立长期的 TCP 连接并且不会中断,这是错误的吗?
如果是这样,缓解这个问题的最佳方法是什么?
如果没有,有没有人有调试丢失连接的策略?
提前致谢 :)
答案1
是的,认为 TCP 完全可靠是非常错误的。您需要在设计应用程序时考虑容错性。由于存在大量客户端设备,TCP 可能会中断、超时,并出现其他不良行为。
如何修复此问题很大程度上取决于您的应用程序,并且与 serverfault 无关。您可能在 stack overflow 或 gamedev stack exchange 上会更幸运。
答案2
在靠近最终用户的 AWS 区域启动一个微型或 m1.small 实例,并在其上安装 HAProxy。
以 TCP 模式配置代理以监听适当的端口并将连接中继到俄勒冈州。
代理实际上将为每个会话管理 2 个单独的连接,每个方向一个(从用户到您的服务器),您可能会发现此设置有助于稳定情况。代理将监听连接,每次有连接进入时,它将与您的服务器建立单独的出站连接。一旦该连接建立,代理将盲目地将这些连接的数据管道绑定在一起并保持连接,直到其中一端或另一端断开连接 - 或者代理的内部空闲超时计时器到期,这也会关闭连接,因此您可能需要将超时时间从默认值增加。
从理论上讲,这并不重要,但在实践中,用户和代理之间以及代理和主服务器之间的连接的质量和可靠性可能比“直接”连接好得多,从而使端到端连接更加可靠。
您会发现 HAProxy 可以在非常小的服务器上处理数百个同时连接。它不是此应用程序的唯一工具,但它是我最熟悉的工具。