5

我正在开发一款多人在线游戏。我有以下问题:

当用户断开与服务器的连接时,他需要重新连接。在第一个连接处,在注册期间,注册模块会生成一个特殊的 ResponseDispatcher,它保存对连接 Channel 的引用。但是如果用户退出,这个 Channel 就失效了。尽管我可以检测到问题并清理资源,但我必须将注册模块和连接模块的引用存储到游戏模块,以便在用户授权并重新连接时更新 Channel。这在模块之间产生了很多相互依赖,并且很难维护。

我需要的是 Servlet Container 中的 HttpSession 之类的东西,这样我就可以从我的服务器的所有模块中获取对我的通道和会话资源的引用。

Servlet 中的 HttpSession 是如何实现的?它是一个存储所有 JSESSIONID 的全局 hashmap,容器从中确定返回哪个属性映射?如果它是一个全局 sysmbol 表,它是否会影响性能(即使 hashMap 的时间是 O(1),也可能存在会话修改,因此它可能必须同步)?

PS。也许这种情况下的一些设计模式建议也可以。

4

3 回答 3

3

我建议尝试Shiro

Shiro 可以在 servlet 容器之外处理会话管理。

您可能希望使用EhCache支持 Shiro以提供适当的缓存,如果需要,还可以提供会话持久性(和负载平衡等...)

于 2013-10-24T08:26:23.647 回答
2

我不确定问题是什么。为什么“必须存储对注册模块和连接模块的引用”?

无论如何,您的问题有两个立即明智的解决方案。

1)使注册模块和连接模块单例。这是否有用完全取决于这些模块提供的功能。

2)使注册模块和连接模块持久实体,将它们保存到数据存储,完成必要的引用,并在重新连接时检索和重建它们。

我不太确定为什么滚动您自己的会话实现会是您想要做的事情,当会话超时时会发生什么?

您的设计似乎有些缺陷。如果连接中断,玩家不应该“仍然在线”(这是一个矛盾的术语,根据定义,如果您没有连接到网络,您就不能在线),无论这是否是故意的(您无法知道不管是有意还是无意),你不知道玩家是否能够及时重新连接,所以你应该假设最坏的情况。更重要的是,从纯粹的设计方面来看,被游戏杀死,因为你的互联网连接是垃圾,可能不是你想要处理的事情。如果持久化数据是如此昂贵的事情,您应该重新检查您的数据存储选项。另外,在他离线时服务器崩溃的情况会发生什么?

于 2013-10-24T08:45:41.187 回答
2

看看门面模式

在此处输入图像描述

于 2013-10-24T07:36:15.157 回答