关于使用 websocket 和 node.js编写可扩展的实时回合制策略游戏的建议



>我打算写一个实时回合制策略游戏服务器在节点顶部.js使用 WebSockets。我将迎合现代浏览器具有良好的HTML5支持,并且不太关心向后兼容性。

所提供的游戏将由少数玩家在时间(比如 2-10(,并将有一个时钟计时器,用于国际象棋并在 www.chess.com 实现。定时游戏最多持续一个小时,也可以选择玩非定时游戏。

服务器将负责玩家的评分,玩家的朋友列表,以及管理正在运行/已完成的游戏状态,以及运行游戏时钟。游戏状态将只是一点 json,并且每个最多只有几千字节游戏。

一个限制是所有实际的游戏逻辑都必须发生在客户端,而不是在我的服务器上。正因为如此,我需要一种机制如果客户发出非法行动的信号,无论是因为它还是它的对手故障/恶意,然后是一个或多个不相关的客户端(即其他人(使用我的网站(将游戏状态加载到他们的浏览器中背景和争议将在那里解决。

这大约总结了我的要求。

这不是一个玩具项目,我希望有很多用户,所以我想考虑后端预先提供架构和可扩展性。我对节点不是特别了解.js或一般的网站部署,因此对 VIS 架构的任何建议或见解,技术/库,可扩展性/代理/负载平衡,如何实现时钟和处理延迟问题,在哪里/如何存储游戏状态等,非常感谢。

Node.js它的流行库在编写时考虑了可扩展性,所以......像Express,Mongodb/Redis socket.io 这样的通用工具都可以做得很好。

关于客户端逻辑:

一个不相关的一个或多个客户端(即使用我的网站的其他人(将在后台将游戏状态加载到他们的浏览器中,争议将在那里解决。

node.js的一大优点是它与浏览器中的javascript相同:)。 因此,您可以在服务器中运行相同的代码并解决那里的任何争议。

任何项目的第一件事就是将技术要求列表放在一起。以下是基于您在帖子中写的内容的示例:

  1. "服务器将负责[...]" - 您帖子中的项目列表表明您需要某种用户登录身份验证机制。
  2. "玩家的评分,玩家的朋友列表" - 这些需要存储在某种数据库中。
  3. "管理正在运行/已完成的游戏状态,运行游戏时钟" - 将连接的玩家与正在运行的会话进行实时数据处理。
  4. 如果您计划存储匹配的结果,则需要将实时应用程序与数据库存储连接。
  5. "所有实际的游戏逻辑都必须发生在客户端上" - 你见过浏览器任务吗?游戏的巨大问题是所有用户信息都存储在客户端上。要获得所有游戏特权,您只需手动编辑本地存储。我唯一能想到的解决这个问题就是将整个游戏逻辑编码到浏览器中,然后验证连接的每个客户端的每个动作。但这会产生一个问题,用户可以修改逻辑来对应该合法的举动提出异议。

当您为项目有一个明确定义的技术要求列表时,找到您正在寻找的库应该容易得多。例如,socket.io 是处理 Web 套接字的优秀库。

游戏代码"不受信任"有什么原因吗? 您需要做的就是验证 JSON 输入,并确保移动不违反任何规则。 在不知道更多细节的情况下,我不确定我是否可以就如何解决客户之间的纠纷提供建议,但我认为没有理由不信任游戏代码。

这个问题实际上听起来类似于我读过的一篇关于分布式冲突检测和解决的论文,它减少了服务器网络压力。 这是通过让所有"客户"对可预测的未来状态进行投票来实现的,其中每个客户端都直接. 如果没有争用,则达成协议,游戏继续。 如果存在争用,并且无法达成协议,则迁移将中止。

它还为投票是否"及时"完成提供了一些有趣的想法(鉴于您的游戏是回合制的,您可能不必处理这种情况(。

与其在

无法到达冲突时中止移动,不如编写一些逻辑来确定移动是否有效。 这就是很难回答您的问题的地方,因为除了服务器(甚至不能信任游戏代码本身(之外,您似乎无法信任任何东西。

我认为,为了可靠地解决这个问题,您可能必须采用您现有的想法之一:在服务器上启动沙盒游戏,询问不相关的客户端(这可能不可靠(,或者删除其中一个约束,并直接询问服务器。

相关内容

  • 没有找到相关文章

最新更新