【问题标题】:Java Session ImplementationJava 会话实现
【发布时间】:2013-10-23 12:14:49
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 我需要的是 Servlet 容器中的 HttpSession 之类的东西...我不确定你是否需要这个。我没看错:你获取了用户信息,当用户稍后登录时,你需要再次获取此信息?如果是这样,为什么不将数据存储在服务器端(在 da 数据库中)?
  • 是的,但他/她重新登录(连接中断)。这意味着我不想将他的数据存储在数据库中 - 玩家仍然在线。他的客户端只需要重新建立连接,使用相应的模块执行身份验证过程,并以某种方式连接到正在运行的 JVM 进程(游戏模块),他的数据已经存在。问题是我需要再次将所有模块连接在一起。当玩家有意离开游戏时,会将所有内容存储在数据库中。在这种情况下,我可以负担得起使用额外的资源加载 + 数据库处理。
  • 您的应用程序是否在 Servlet 容器中运行?
  • 没有。它是我自己的游戏服务器 - Java SE7 + Netty。

标签: java design-patterns servlets hashmap mmo


【解决方案1】:

我建议尝试Shiro

Shiro 可以在 servlet 容器之外处理 Session Management

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

【讨论】:

    【解决方案2】:

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
    • 同意未知页面,但可以信任维基百科链接。尽管如此,还是为其他 SOF 用户进行了更改。
    【解决方案3】:

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

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

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

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

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

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

    【讨论】:

    • 玩家可以处于几种状态 - 如果他在线并且没有做任何特定的事情 - 那么是的,我通常可以保存他的数据。但如果他在战斗中,我不想立即保存他的数据——因为他的 hp 可能会迅速变化。 + 即使他在短时间内断开连接,其他玩家也应该看到他。万一他回来,必须立即将他拉上战场。一些存储操作需要 80 毫秒才能完成(战斗日志)。我正在使用 JPA。尽管如此,使用普通 JDBC 的时间减少了 2 倍,但仍然是毫秒。
    猜你喜欢
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    • 2015-11-30
    • 2011-10-31
    • 2021-08-27
    • 2012-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多