我正在尝试编写像Zynga Poker这样的iOS / Android扑克应用程序,我必须同时处理多达300,000个客户端连接,而且随着我的用户群增长,我还要做更多。客户将连接到未填充的房间,其中5-9个玩家与其他玩家互动,并且能够互相发送消息。 我做了很多研究,似乎Twisted Matrix是事实上的标准,但我对gevent也很感兴趣,因为它使用协程而不是回调来处理异步编程。但令我担心的一件事是来自这个网站的程序员,http://news.ycombinator.com/item?id=2288081写了这个
“这就是为什么我不明白为什么许多高端的实时网络创业公司(如Convore),仍然使用劣质解决方案,如Python eventlib或gevent,它们最多让它们处理数百到数千个客户端。”
这是真的吗?所以我在使用哪个框架之间徘徊。或者那里有更好的东西吗?是300k连接要求python的大部分?如果是,我愿意用java或C ++来做服务器,但我宁愿使用python。
答案 0 :(得分:5)
300,000个并发活动连接太多,无法在单个进程或单台计算机上合理支持,无论您使用何种语言。如果您的程序需要对数据执行任何操作,那么您将需要更多硬件。
让我们回顾信封数学来支持它。
让我们说,平均而言,您的用户点击鼠标或点击一个键或以其他方式每5秒左右做一次。那是每秒60,000次读取事件。现在,假设您必须为每个事件更新所有玩家,我们说每个游戏中有5个玩家,这意味着每秒额外增加300,000个写入事件。所以:每秒计算360,000比特的“事物” - 假设你只需要为输入和输出计算一些字节,而你没有任何计算密集的游戏逻辑(如A.I.玩家)来调用。
假设您正在使用M3 Double Extra Large实例,这是亚马逊目前提供的最大实例。这是8个虚拟核心。假设您的程序纯粹可并行化,这意味着您的游戏中的每个输入或输出事件(包括所有数据库活动,外部Web服务API调用等)都需要在0.00002秒内处理。现在,这绝对没有任何开销来处理负载峰值,所以你真的希望减少一半,以便在流量变化的情况下有任何合理的希望,这意味着每个事件0.00001秒。对于您要执行的所有游戏代码,这是一个十分微秒的非常严格的限制;大多数情况下,这种响应性是以毫秒为单位来衡量的。在我(速度相当快)的桌面计算机上,如果中间没有其他代码,则从time.time()
的一次调用到下一次调用只需要2微秒。即使是经过精细调整的C代码也无法在一微秒内完成大量有用的工作。
这意味着,如果您想要达到这种级别的规模,您确实需要能够一次在多个服务器上运行您的服务。而且,一旦您的服务可以在两个服务器上运行,通常将它放在三个,五个或一百个上并不是什么大事。
虽然我非常想告诉你use Twisted(并且你应该有很多很好的理由),但真正的结论是你可以使用任何你喜欢的东西如果您以不依赖于服务于所有请求的单个服务器的方式编写连接,它将“扩展”到您的数十万个连接。在您实际处理300k实时并发连接的服务时,使用gevent或Twisted或Tornado或Eventlet或EventMachine之间的性能差异 - 如果实际上有任何差异 - 将是两者之间的区别,让我们说,从亚马逊租赁50和55个实例。 (并且,很难说哪一个会更快,因为它取决于你将如何处理它。)分析你的自己的代码并密切关注它的性能之间的区别然而,开发它是租赁500台机器和租赁50台之间的区别。