Asynchronous 我应该使用什么网络库来编写服务器来处理300k以上的客户端?

Asynchronous 我应该使用什么网络库来编写服务器来处理300k以上的客户端?,asynchronous,twisted,gevent,Asynchronous,Twisted,Gevent,我第一次尝试编写一个iOS/Android扑克应用程序,比如Zynga poker,在Zynga poker中,我一次必须处理多达30万个客户端连接,而且随着我的用户群的增长,我还要处理更多的客户端连接。客户将连接到有5-9名玩家与其他玩家交互的未填满的房间,并且能够相互发送消息。 我做了很多研究,Twisted Matrix似乎是事实上的标准,但我对gevent也非常感兴趣,因为它使用协同路由而不是回调来处理异步编程。但有一件事让我担心,就是这个网站的一些程序员写了这篇文章 “这就是为什么我不

我第一次尝试编写一个iOS/Android扑克应用程序,比如Zynga poker,在Zynga poker中,我一次必须处理多达30万个客户端连接,而且随着我的用户群的增长,我还要处理更多的客户端连接。客户将连接到有5-9名玩家与其他玩家交互的未填满的房间,并且能够相互发送消息。 我做了很多研究,Twisted Matrix似乎是事实上的标准,但我对gevent也非常感兴趣,因为它使用协同路由而不是回调来处理异步编程。但有一件事让我担心,就是这个网站的一些程序员写了这篇文章

“这就是为什么我不明白为什么许多知名度很高的实时网络初创公司(如Convare)仍然使用劣质的解决方案,如Python eventlib或gevent,它们最多只能处理数百到数千个客户。”


这是真的吗?所以我在使用哪个框架之间左右为难。还是有更好的?300k连接对python的要求很高吗?如果是,我愿意用java或C++来做服务器,但是我宁愿使用Python。p> 300000个并发的、活动的连接太多,无论您使用何种语言,都无法在单个进程或单个计算机上合理支持。如果您的程序需要对数据做任何事情,您将需要更多的硬件

让我们做一些简单的数学来支持这一点

比方说,平均来说,你的用户每5秒左右点击鼠标、按键或做一件事。这就是每秒60000个读取事件。现在,假设每个游戏中有5名玩家,这意味着每秒额外有300000个写入事件,假设您必须为每个事件更新所有玩家。因此:每秒需要计算360000位的“东西”——假设您只需要计算一些字节来进行输入和输出,并且没有任何计算密集型的游戏逻辑(如A.I.玩家)可以调用

假设您使用的是亚马逊目前提供的最大实例。这是8个虚拟核心。假设您的程序是完全可并行的,这意味着游戏中的每一个输入或输出事件(包括所有数据库活动、外部web服务API调用等)都需要在0.00002秒内处理。现在,这使您完全没有处理负载峰值的开销,因此您真的希望将其减半,以便在流量变化时有合理的希望保持正常,这意味着每个事件0.00001秒。这是一个非常严格的限制,你所有的游戏代码都要执行10微秒;大多数情况下,这种响应以毫秒为单位。在我(速度相当快)的台式计算机上,如果中间没有其他代码,从一次调用
time.time()
到下一次调用几乎需要两微秒。即使是经过微调的C代码也不能在一微秒内完成很多有用的工作

这意味着,如果你想达到这个规模,你真的,真的需要一次能够在多台服务器上运行你的服务。而且,一旦您的服务可以在两台服务器上运行,一般来说,将其放在三台、五台或一百台服务器上并不是什么大问题


虽然我很想告诉你(你应该这么做有很多很好的理由),但真正的结论是,你可以使用任何你喜欢的东西,它会“扩展”到你数十万的连接,前提是您编写它的方式不依赖于为您的所有请求提供服务的单个服务器。当您的服务实际处理300k实时并发连接时,使用gevent或Twisted或Tornado或Eventlet或EventMachine之间的性能差异——如果事实上存在任何差异的话——将是从Amazon租赁50和55个实例之间的差异。(而且,很难说哪一个更快,因为这在某种程度上取决于您将如何使用它。)然而,评测您自己的代码和在开发过程中密切关注其性能之间的区别,租赁500台机器和租赁50台机器之间有什么区别。

300k连接在什么架构和硬件上?我计划有一个全球服务来处理登录、消息和负载平衡,而其他服务器将处理实际游戏中的任意多个房间。我计划使用AmazonEC2,只是想指出Twisted与协同程序完全兼容。协同路由与事件驱动的网络引擎正交。有关如何使用Twisted的首选编程风格的更多信息,请参阅inlineCallbacks和corotwine。