【发布时间】:2014-03-25 17:27:36
【问题描述】:
基础知识
现在我和我的几个朋友正在尝试开发一个用 nodejs 制作的浏览器游戏。这是一款多人自上而下的射击游戏,大部分客户端和服务器端代码都使用 JavaScript。我们有一个很好的总体方向,我们想进入,我们在开发游戏时获得了很多乐趣。制作这款游戏时,我们的目标之一是让作弊变得尽可能困难。这样做,我们所有的游戏逻辑都在服务器端处理。客户端仅通过 Web 套接字将其输入发送到服务器,而服务器会根据游戏中发生的情况更新客户端(也是 Web 套接字)。这是我们问题的开始。
所有服务器端的数学运算都变得相当庞大,我们发现我们需要以某种方式扩展以处理超过 10 个玩家(我们希望能够托管更多)。起初我们认为我们可以根据需要垂直扩展,但由于 nodejs 是单线程的,因此只能利用一个核心。这意味着获得更强大的服务器不会解决这个问题。我们唯一的解决方案是水平扩展。
我们为什么在这里问
我们还没有找到任何关于如何扩展 nodejs 游戏的好例子。我们的用例非常特殊,虽然我们已经尽了最大努力自己做到这一点,但我们确实可以从外部意见和建议中受益
详情
我们已经对如何解决这个问题进行了很多思考。我们已经为此工作了一个多星期。到目前为止,我们汇总了以下内容:
四种服务器
我们将任务分成 4 种不同“类型”的服务器。每个人都会完成一项特定的任务。
代理服务器
代理服务器将位于整个堆栈的最前面,并且是唯一可以从 Internet 直接访问的服务器(可能还有更多)。它上面会有 haproxy,它会将所有连接路由到 Web 服务器。我们之所以选择 haproxy,是因为它具有丰富的功能集、可靠性和几乎无与伦比的速度。
网络服务器
网络服务器将接收网络请求,并提供所有网页。他们还将处理大厅创建/管理和游戏创建/管理。为此,他们会告诉游戏服务器它有哪些大厅,该大厅中有哪些用户,以及他们将要玩的游戏的信息。然后,网络服务器将更新游戏服务器关于用户输入的信息,而游戏服务器将更新网络服务器(然后更新客户端)游戏中发生的事情。 Web 服务器将使用 TCP 套接字与游戏服务器就任何类型的管理进行通信,并且在与游戏更新进行通信时它们将使用 UDP 套接字。这一切都将通过 nodejs 完成。
游戏服务器
游戏服务器将处理有关游戏的所有游戏数学和变量更新。游戏服务器还与数据库服务器通信,以记录游戏中玩家的酷统计数据。这将使用 nodejs 完成。
数据库服务器
数据库服务器将托管数据库。这部分实际上是最简单的,因为我们找到了rethinkdb,这是有史以来最酷的数据库。这很容易扩展,而且奇怪的是,结果证明这是扩展我们的应用程序最简单的部分。
其他一些细节
如果您无法理解我们的整个设置,look at this,这是一张关于我们认为我们将如何扩展的半准确图表。
如果您只是好奇,或者认为看看我们的游戏可能会有所帮助,它目前在此处以未缩放的状态托管。
一些我们不想要的东西
- 我们不想使用nodejs的集群模块。它不稳定(说here),它不能扩展到其他服务器,只能扩展到其他处理器。我们只想跨过水平缩放。
我们的问题,总结
我们希望我们正朝着正确的方向前进,并且我们已经完成了我们的功课,但我们不确定。我们当然可以就如何以正确的方式做到这一点提出一些建议。
谢谢
我知道这是一个很长的问题,想出一个深思熟虑的答案并不容易,但我真的很感激。
谢谢!!
【问题讨论】:
-
我想知道这些年来这是怎么做到的。这是我目前正在尝试解决的问题。
-
你可能想看看 PM2. pm2.keymetrics.io
标签: javascript node.js sockets scalability autoscaling