免责声明:我的游戏编程经验基于客户端单人游戏,但是我具有Web应用程序背景(尤其是Microsoft堆栈),因此我从这个答案中受益匪浅,我认为适用,但是如果没有对真实游戏服务器进行实际测试,就很难说出它将如何应用,但这是可行的。知道这一点:我尚未部署游戏服务器,仅部署了Webapp。
我建议采用两层(服务器)方法。数据库层和“应用程序”层;第三(展示)层是您的游戏客户端。
关系数据库擅长查询数据,并且擅长写数据。关键是将数据库写入序列化为集群可以处理的可管理大小的块。SQL Server的更高级版本(数据中心/企业版)支持群集和复制。我将从构建一个小型集群开始,并对它运行一些查询以了解其工作原理。
在应用程序层中,如果您正在执行“分区”或类似的操作,则可能无需设置任何集群就可以摆脱困境,而只需为每个区域设置一台服务器即可。如果区域变大,则可以为每个区域设置一个群集。
您将需要构建一个序列化过程,以从应用程序层->数据库层发送数据。关键是要进行多个级别的序列化。东西像这样:
- 级别1:每X秒保存到数据库,包括关键数据:
- 级别2:每2X秒保存到DB,包括中等数据:
- 级别3:尽可能少地进行其他所有操作
这将使您的写入保持一致和可预测,具体取决于您的游戏的性质,您可能不经常进行数据库写入。关键是要意识到,如果您的应用程序服务器崩溃了,您必须从数据库中的状态恢复在线,因此每90分钟序列化玩家清单可能会使玩家感到沮丧。
为了读取数据,您需要将尽可能多的负载加载到应用程序层的内存中,然后确保所有代码都使用此内存池,在后台可以将内存池与数据库同步。正如Joe指出的那样,有时您需要“实时”交易。通过序列化大多数写入操作,您应该在数据库上仍具有足够的IO以在必要时进行实时事务,并假定数据库服务器/集群上具有足够的硬件。