如何解耦实时游戏架构

Posted

技术标签:

【中文标题】如何解耦实时游戏架构【英文标题】:How to decouple a realtime game architecture 【发布时间】:2014-04-10 08:51:25 【问题描述】:

我有一个运行在节点后端的实时 html5 画布游戏。玩家通过 Websocket (socket.io) 连接。问题是有时我需要部署新代码(例如修补程序)并重新启动服务器,但我不想断开玩家的连接。

我的想法是将 websocket 服务器和应用程序服务器划分为可单独部署的组件,并在中间添加一个消息队列以将 2 个组件解耦。这样,如果应用程序服务器正在重新启动,消息堆积时只会有一个短暂的延迟,但不会丢失任何内容。这是一个好策略吗?有其他选择吗?

【问题讨论】:

你不需要这样解耦:如果你只是让队列持久化(或者如果你解耦它),你只需要在断开连接并询问状态时让浏览器重新连接。 恕我直言,修补程序不应该部署在实时服务器上,如果修补程序破坏了其他一些行为怎么办?在修复程序的积极行为按计划将其合并到生产之后,拥有开发服务器将是一个好主意,您可以在其中推送您喜欢的所有内容。玩家可以耐心等待 5 分钟的停机时间,但如果生产更新需要更多时间,您最终会失去他们。 您提供赏金但不回复 cmets 或回答,好像您不在乎的事实令人不安。你在期待什么? @MattHarrison 我并不是要你接受我的回答,而是要准确地说出你想要什么。这也有助于其他用户给出好的答案。 【参考方案1】:

基于 websocket 的应用程序很可能会在用户没有注意到任何事情的情况下重新启动(my chat server for example 就是这种情况)。

为了实现这一点,解决方案不是让 websocket 应用程序被隔离并且永不重启。事实上,这将是非常乐观的(你确定你可以确保它的 API 永远不会改变吗?)。

解决办法是

    确保客户端在断开连接时重新连接(如果您使用 socket.io 进行 websocketing,这是标准配置) 让服务器在客户端发起重新连接时向客户端询问其 ID(或会话 ID) 保持应用程序的状态。这通常使用数据库来完成。如果您的服务器除了客户端之间的队列之外没有其他状态(这不太可能),那么您可能会寻找现有的持久队列实现或在快速本地存储上构建自己的(想到 redis)

【讨论】:

“如果您的服务器除了客户端之间的队列之外没有其他状态”。我的应用程序目前实际上没有队列。我的部分问题是我的问题是否表明使用队列是有益的。 很难知道,因为它是特定于应用程序的。但是队列很少是​​最好的解决方案(如果在数据库中实现队列会更糟)。在我制作的一个基于 websocket 的游戏平台中,应用程序的状态被简单地持久化并且可以被客户端查询。游戏动作是由 websocket 发送的,但如果应用程序断开连接,它只需要查询状态(保留在 db 服务器端)。

以上是关于如何解耦实时游戏架构的主要内容,如果未能解决你的问题,请参考以下文章

《游戏引擎架构》笔记十四

游戏开发经验总结:分布式架构数据库与进程设计

需要从外部服务器进行实时轮询的网站架构设计

实时数据传输架构

《游戏编程模式》

Socket.io & Redis - 适合 io 游戏的架构?