这些天,我正在尝试为公司设计一款新的MMORPG手机游戏的体系结构。该游戏类似于黑手党战争,iMobsters或风险。基本思想是准备一支军队与您的对手(在线用户)作战。
尽管我以前曾从事过多个移动应用程序的工作,但这对我来说却是新事物。经过大量的努力,我提出了一个架构,该架构借助高级流程图进行了说明:
我们决定采用客户端-服务器模型。服务器上将有一个集中式数据库。每个客户端将拥有自己的本地数据库,该本地数据库将与服务器保持同步。该数据库用作存储不经常更改的内容(例如地图,产品,库存等)的缓存。
使用此模型后,我不确定如何解决以下问题:
- 同步服务器和客户端数据库的最佳方法是什么?
- 在将事件更新到服务器之前,是否应该将事件保存到本地数据库?如果应用由于某种原因终止,然后将更改保存到集中式数据库,该怎么办?
- 简单的HTTP请求是否可以达到同步目的?
- 如何知道当前登录的用户?(一种方法是让客户端每隔x分钟继续向服务器发送一个请求,以通知该请求处于活动状态。否则,认为客户端处于非活动状态)。
- 客户端验证足够吗?如果没有,如果服务器未验证某些内容,如何还原操作?
我不确定这是否是一个有效的解决方案,以及它将如何扩展。如果已经在此类应用程序上工作的人们能够分享他们的经验,这可能有助于我提出更好的建议,我将不胜感激。提前致谢。
附加信息:
客户端是在称为果酱的C ++游戏引擎中实现的。这是一个跨平台的游戏引擎,这意味着您可以在所有主要的移动操作系统上运行您的应用程序。我们当然可以实现线程化,这在我的流程图中也有说明。我打算将MySQL用于服务器,将SQLite用于客户端。
这不是回合制游戏,因此与其他玩家的互动不多。服务器将提供在线玩家列表,您可以通过单击“战斗”按钮与他们进行战斗,并在播放一些动画后宣布结果。
对于数据库同步,我想到了两种解决方案:
- 存储每个记录的时间戳。还应跟踪本地数据库的最新更新时间。同步时,仅选择时间戳较大的行并将其发送到本地数据库。为已删除的行保留一个isDeleted标志,以便每个删除行为都只是一个更新。但是我对性能有严重的怀疑,因为对于每个同步请求,我们都必须扫描整个数据库并查找更新的行。
- 另一种技术可能是保留针对用户进行的每次插入或更新的日志。当客户端应用程序要求同步时,请转到该表并找出已更新或插入了该表的哪些行。这些行成功传输到客户端后,请删除此日志。但是我想到了如果用户使用其他设备会发生什么。根据日志表,已为该用户传输了所有更新,但实际上是在另一台设备上完成的。因此,我们可能还必须跟踪设备。实施此技术比较耗时,但不确定是否会执行第一个。