REST api 旁边的实时多人游戏

Posted

技术标签:

【中文标题】REST api 旁边的实时多人游戏【英文标题】:Realtime multiplayer game along side REST api 【发布时间】:2014-08-22 07:28:00 【问题描述】:

我是一名刚刚迁移到 Node 的 Rails 开发人员,我决定编写一个由 postgres/express.js REST api 支持的 Angular 应用程序。到目前为止,我主要将 api 用于 CRUD 操作,但我想在两个玩家访问某个页面(互相挑战)时启动一个实时游戏实例。我正在考虑使用 socket.io 来完成实时功能。

该游戏类似于 gameboy 中的口袋妖怪,玩家轮流执行某些动作,直到其中一个获胜。

我有以下问题:

    我应该有一个单独的服务器来使用 socket.io 处理游戏,还是可以使用与我的 API 运行的服务器相同的服务器?

    我应该使用像 Pusher 这样的服务还是我可以自己创建架构?

    如果玩家在游戏期间断开连接,我将如何确保没有数据丢失?

    在什么时候(并发连接数/每秒请求数)我会遇到性能问题? 100、1000、10000?

谢谢

【问题讨论】:

【参考方案1】:

    如果实时逻辑与 CRUD 密切相关(即实时事件是写入 API 的直接结果),并且您期望系统的两个方面的使用情况大致相同,那么我会都在同一台服务器上。

    如果可能,我强烈建议使用实时推送服务(免责声明:我为 Fanout.io 工作)。它会更简单,也可能更便宜。

    确保数据不丢失的关键是在发送前将其保存在服务器上。不要依赖实时层来实现持久性(您可能犯的最大错误)。当客户端重新连接时,它可以通过普通 API 请求可能丢失的数据。因此,只需让您的 CRUD 内容正确,然后将实时事件分层放在上面。您可以通过这种方式创建一个非常具有网络弹性的服务。

    您应该能够不假思索地获得数百个并发连接。超越将需要架构规划。当然,如果您委托给推送服务,那么您不必担心这一点,至少对于实时部分而言。

【讨论】:

感谢回复,架构规划具体包括哪些内容? 我的意思是您可能需要购买更大的服务器,利用每台服务器的多个内核(运行多个节点实例?),在许多服务器之间进行负载平衡,优化您的网络交互以实现更高的吞吐量服务器等

以上是关于REST api 旁边的实时多人游戏的主要内容,如果未能解决你的问题,请参考以下文章

保存的游戏+实时多人Android

Google Play 游戏服务实时多人游戏停止工作

如何在实时多人游戏中移动对象? (统一的 Google Play 游戏插件)

Firebase 实时多人游戏

实现实时多人游戏存在哪些问题

谷歌玩游戏实时多人游戏如何获得快速匹配玩家的名字?