Mic*_*ael 24 javascript sockets scalability node.js autoscaling
现在我的一些朋友和我正在尝试开发一个在nodejs中制作的浏览器游戏.这是一个多人自上而下的射击游戏,客户端和服务器端代码中的大多数都是用javascript编写的.我们有一个很好的总体方向,我们想进去,我们在开发游戏方面有很多乐趣.制作这款游戏时我们的目标之一就是让它尽可能地作弊.做到这一点,我们所有的游戏逻辑都在服务器端处理.客户端仅通过Web套接字将其输入发送到服务器,并且服务器使用游戏中发生的事情更新客户端(也是Web套接字).这是我们问题的开始.
所有的服务器端数学都变得非常沉重,我们发现我们需要以某种方式扩展以处理超过10个玩家(我们希望能够容纳更多).起初我们认为我们可以根据需要垂直扩展,但由于nodejs是单线程的,因此只能利用一个核心.这意味着获得更强大的服务器无助于解决这个问题.我们唯一的解决方案是横向扩展.
我们还没有找到任何关于如何扩展nodejs游戏的好例子.我们的用例非常特别,虽然我们已经尽力做到了这一点,但我们真的可以从外部意见和建议中受益
我们已经对如何解决这个问题投入了大量的思考.我们已经研究了一个多星期了.这是我们到目前为止所做的事情:
我们将任务分成4种不同的"类型"服务器.每个人都将完成一项特定的任务.
代理服务器将位于整个堆栈的前端,并且是可从Internet直接访问的唯一服务器(可能有更多这些服务器).它会有haproxy,它会将所有连接路由到Web服务器.我们之所以选择haproxy,是因为它具有丰富的功能集,可靠性和几乎无与伦比的速度.
Web服务器将接收Web请求,并为所有Web页面提供服务.他们还将处理游说创建/管理和游戏创建/管理.要做到这一点,他们会告诉游戏服务器它有什么游说,用户在那个大厅,以及他们将要玩的游戏的信息.然后,Web服务器将更新游戏服务器关于用户输入,并且游戏服务器将更新游戏中发生的事件的Web服务器(谁将更新客户端).Web服务器将使用TCP套接字与游戏服务器就任何类型的管理进行通信,并且在与游戏更新进行通信时将使用UDP套接字.这将全部用nodejs完成.
游戏服务器将处理有关游戏的所有游戏数学和变量更新.游戏服务器还与数据库服务器通信,以记录游戏中玩家的酷炫统计数据.这将通过nodejs完成.
db服务器将托管数据库.事实证明这部分是最简单的,因为我们找到了rethinkdb,这是有史以来最酷的数据库.这很容易扩展,奇怪的是,它是扩展我们的应用程序最简单的部分.
如果你无法解决整个问题,那么看看这个,这是我们认为我们将如何扩展的半准确图表.
如果你只是好奇,或者认为看看我们的游戏可能会有所帮助,那么它目前在这里处于未扩展状态.
我们希望我们朝着正确的方向前进,我们已完成了我们的功课,但我们不确定.我们当然可以采取一些技巧,以正确的方式做到这一点.
我意识到这是一个很长的问题,做出深思熟虑的答案并不容易,但我真的很感激.
谢谢!!
Gho*_*ler 12
跟随我对你的案子的自发想法:
node.js也可以使用多个核心进行扩展.如何,你可以在这里阅读(或者只是想一想:你有一个线程/进程在一个核心上运行,你需要使用多个核心?多个线程或多个进程.将工作从主线程推送到其他线程或过程,你就完成了).
我个人会说开发一个不使用多核的应用程序是幼稚的.如果您使用了一些后台进程,那么,但是如果您现在只在node.js主事件循环中工作,那么您应该投入一些时间来使应用程序可以在核心上进行扩展.
顺便说一句,实现类似IPC的东西并不容易.你可以这样做,但是如果你的情况很复杂,那么你可以选择集群模块.这显然不是你最喜欢的,但仅仅因为某些东西被称为"实验性",它并不意味着它是无用的.试一试,也许你甚至可以修复模块中的一些错误.最有可能更好地使用一些广泛使用的软件来解决复杂问题,而不是发明一个新的轮子.
您还应该(如果您还没有)考虑(明智地)使用nextTick功能.这允许主事件循环暂停一些CPU密集型任务并同时执行其他工作.你可以在这里阅读它.
你一定要仔细看看你的游戏引擎算法.你已经注意到这是你现在的瓶颈,实际上计算是大多数游戏中最重要的部分.缩放确实以一种方式解决了这个问题,但缩放引入了其他问题.此外,你不能把"缩放"作为问题解决者扔在一切上,并期望每个问题都消失.
您最好的选择是让您的游戏代码优雅而快速.想想如何有效地解决问题.如果你无法有效地解决Javascript中的问题,但问题很容易被提取,为什么不写一点C组件呢?这也算作一个单独的进程,这减少了主node.js事件循环的负载.
就个人而言,我现在还没有看到代理级别的优势.你似乎没有期望大量的用户,因此你不需要解决像CDN解决的问题或其他任何问题......可以考虑它,但我现在不会在那里投入太多时间.
从技术上讲,您的网络服务器软件很有可能提供代理功能.因此可以将它放在纸上,但我现在不打算使用专用硬件.
其余对我来说似乎或多或少.