似乎大多数 mmorpg 游戏都有一些定期的服务器维护,有些是每天,有些是每周一次。他们实际上必须做什么,为什么有必要?
如果你从这样一个项目开始,你能做些什么来避免这种情况?
har*_*ark 17
我怀疑他们正在部署最新版本的代码,这要求他们重新启动应用程序(并希望在重新启用访问之前运行一些测试)。从这个角度来看,它更像是 StackOverflow 问题,而不是 ServerFault 问题。
我认为创建一个热补丁系统是可能的,但它必然会非常复杂。据我了解,一个 MMO 服务器“应用程序”由几个不同的组件组成——
登录服务器——处理身份验证并充当游戏服务器之间的“枢纽”。一旦客户端进入游戏,他们就不再与登录服务器交互。在这样的系统中,您可以应用补丁并重新启动登录服务器而不会干扰游戏(尽管您将有一段时间无法登录)。
游戏服务器——机器集群分组为逻辑独立单元(“世界”等)。假设每个游戏集群使用某种内部通信协议来相互对应状态;您可能需要一次性修补每个集群。一种可能的方法是修补热故障转移。然后你需要能够
数据库服务器——某种持久性数据存储,如 RDBMS。希望您不会经常更改数据存储。大概每个游戏服务器/集群都有一个独立的数据存储。您也许可以在热故障转移中使用相同的技巧(并告诉游戏服务器断开连接,等待旧数据库和故障转移数据库同步,然后重新连接到故障转移),但这对我来说似乎非常冒险。
上述所有情况都为已经很复杂的系统增加了难以置信的复杂性,并引入了许多代码失败可能导致数据丢失或损坏的地方。
另一种解决方案是使用一种专为 100% 正常运行时间而设计的语言,并具有对运行代码进行热修补的内置功能。Erlang是一个不错的选择(hotpatching 示例),Java 也有类似的功能。
Kar*_*zke 12
没有其他人有过实际运行这样的东西的经验吗?呵呵。
桥接代码和系统的原因有很多。首先,请记住,当前大多数“大型”MMO 引擎都是在几年前编写的,尽管此后图形和技术有所升级,但仍然依赖于许多这些系统在 2000 年左右编写的方式。例如,Eve-Online 仍然在一个巨大的 Microsoft SQL Server 实例上运行,这就是为什么他们总是试图通过升级硬件来从中提取更多。
自 WoW 和 EVE 启动以来,改进的一个例子是在分布式键/值数据库中完成的工作,例如 Google 的 MapReduce(以及它的开源实现,Hadoop)、极快的肯定响应处理队列服务(Amazon SQS)和其他“云”的技术。
我对 EVE 的经验最丰富(我更喜欢激光而不是战斧),所以其中一些示例更面向 EVE。
就系统原因而言:
就软件原因而言:
运行一个既有闭环又有开环的经济体是 MMO 运营商面临的一个问题——如果你不相信我,请阅读一些关于游戏经济的学术论文和一些对像 Ultima Online 这样的老游戏的研究有相对原始的经济。为补充开环和识别作弊和其他负面经济活动而需要进行的分析需要通过数据快照离线进行,有时只能在数据库完全锁定时进行。
如果您注意到,Eve 的维护发生在英格兰的中午,主要数据中心就在那里。