TCP Python服务器

我有一个关于从ec2实例运行tcp服务器的连接可靠性的问题。

我们目前正在使用c3.4xl ec2实例为来自俄勒冈州的世界各地的移动客户提供服务。 我们的产品是一个使用gevent框架用Python编写的现场游戏服务器。 现在我们同时为大约200 – 300个客户提供服务。

问题是我们有很多来自世界另一端的客户在连接和保持连接到服务器时遇到了麻烦。 服务器始终使客户端超时而不closures套接字。 我们看到30秒以上的时间没有听到心跳。

我们假设一个移动客户端可以build立一个来自世界各地的长期TCP连接并且不会被打断是错误的吗?

如果是这样,那么缓解这个问题最好的办法是什么?

如果没有,有没有人有任何debugging丢失的连接的策略?

提前致谢 :)

是的,假设TCP将会完全可靠是非常错误的。 您需要考虑容错性来devise您的应用程序。 如果有大量的客户端设备,那么TCP将会中断,超时,以及其他行为。

你如何解决这个问题很大程度上取决于你的应用程序,而且对于serverfault来说是非常关键的。 你可能会有更好的运气在堆栈溢出,或gamedev堆栈交换。

在靠近最终用户的AWS区域中分别放置一个micro或m1.small实例,并在其上安装HAProxy。

在TCP模式下configuration代理以侦听适当的端口并将连接中继到俄勒冈州。

代理实际上会为每个会话pipe理两个独立的连接,每个连接都有一个连接(从用户到服务器),您可能会发现这种设置有助于稳定事物。 代理将监听连接,每次进入时,它都会向您的服务器发出单独的连接。 一旦连接出现,代理将盲目地将这些连接的数据pipe道连接在一起,并保持连接直到一端或另一端丢失 – 或者代理的内部空闲超时定时器到期,这也会closures连接,所以你可能需要从其默认值中增加超时。

从理论上讲,这并不重要,但实际上,用户与代理之间以及代理与主服务器之间的连接的质量和可靠性可能比“直接”连接要好得多,端到端的连接更可靠。

您应该发现HAProxy可以在一台非常小的服务器上同时处理数百个连接。 这不是这个应用程序的唯一工具,但它是我最亲密的。