1

我正在用 java (SE) + 一些开源库开发一个服务器应用程序。这是一个游戏,所以我认为它有时必须更新。只要应用程序正在跟踪客户端的状态,使用它,并且还支持客户端会话(以专用线程的形式)和存储对这些播放器实例的引用的单例,我想重新加载 JVM 进程(例如安装新版本的 jar 文件),这样一些类和实例不会被 GC 擦除,而是挂接到启动的新进程中。

可能情况:

我有一个游戏版本 1.0 在服务器上运行。我需要在 1.2 中添加一些新功能。但是100名玩家正在互相战斗。我需要安装1.2版,玩家可能会觉得有些卡顿,但是即使jar的版本发生了变化,他们也应该可以继续战斗。

怎么可能呢?

4

3 回答 3

2

看看 JRebel 作者关于该主题的精彩总结:

http://zeroturnaround.com/blog/reloading_java_classes_401_hotswap_jrebel/#!/

于 2013-09-21T22:31:41.963 回答
1

您可以查看诸如 OSGI 和类加载技巧之类的东西,看看您是否可以实现您所需要的,但是也许有一种更简单的方法也更安全一些。

您可以在一个简单的负载平衡器后面运行 2 个服务器,当您需要进行此类维护时,您开始将所有新游戏仅路由到服务器 A。当服务器 B 上的所有游戏都完成时(并且没有新游戏开始,因为所有游戏都将转到服务器 A),您停止服务器 B 并进行所需的任何维护以及任何测试以验证一切正常,然后再将其重新引入“集群”。

然后你做同样的事情并将新游戏路由到服务器 B,这样当服务器 A 上的所有游戏完成时,你也可以关闭它并进行维护。

您将需要开发这个简单的负载均衡器,它只充当连接路由器,但知道您的游戏会话。也许你还需要在每个服务器实例之间进行一些信息同步(如果需要在线交流玩家列表、聊天消息等,取决于你有什么功能)。

于 2013-09-22T00:03:36.987 回答
1

首先要注意的是您当前的游戏状态可能与新版本不一致。所以并不是所有的修改都可以这样安装。您可以使用具有主/从配置的远程缓存系统。这样所有会话都存储在远程机器上,当一台服务器停止时,第二台服务器可以继续以相同的状态工作。首先你放下奴隶,更新它并开始。然后切换角色并放下第二台服务器进行更新。

于 2013-09-23T07:24:56.267 回答