首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我应该使用什么网络库来编写一个服务器来处理300k以上的客户端?

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

Stack Overflow用户
提问于 2012-11-05 10:53:43
回答 1查看 350关注 0票数 2

我第一次尝试编写像Zynga Poker这样的iOS/Android扑克应用程序,在这个应用程序中,我一次必须处理多达30万个客户端连接,而且随着用户数量的增长,我必须处理更多的客户端连接。客户端将连接到5-9个玩家与其他玩家交互的空房间,并有能力相互发送消息。我做了相当多的研究,看起来Twisted Matrix是事实上的标准,但我对gevent也很感兴趣,因为它使用协程而不是回调来处理异步编程。但让我担心的是这个网站的一些程序员,http://news.ycombinator.com/item?id=2288081写了这篇文章

“这就是为什么我不明白为什么许多备受瞩目的实时网络初创公司(如Convore)仍然使用较差的解决方案,如Python eventlib或gevent,它们最多只能处理数百到数千个客户端。”

这是真的吗?因此,我在使用哪个框架之间左右为难。还是有更好的东西在外面?300k的连接对python有多大的要求?如果是,我愿意用java或C++做服务器,但我更愿意使用python。

EN

回答 1

Stack Overflow用户

发布于 2012-11-07 16:31:47

无论您使用的是哪种语言,在单个进程或单个计算机上都无法合理地支持300,000个并发的活动连接。如果你的程序需要对数据做任何事情,你将需要更多的硬件。

让我们做一些粗略的数学运算来支持这一点。

假设,您的用户平均每5秒左右单击一次鼠标或轻击一个键,或以其他方式执行一次操作。这就是每秒60,000个读取事件。现在,假设每个游戏中有5个玩家,这意味着每秒额外的300,000个写入事件,假设您必须为每个事件更新所有玩家。所以:每秒要计算360,000比特的“东西”-假设你只需要计算一些输入和输出的字节,并且你没有任何计算密集型的游戏逻辑(比如人工智能玩家)要调用。

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

这意味着,如果您想要达到这种规模,您真的、真的需要能够同时在多台服务器上运行您的服务。而且,一旦您的服务可以在两台服务器上运行,通常将其放在三台、五台或一百台服务器上也没什么大不了的。

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13225356

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档