java - 如何将现有的 http session 从现有服务器加载到另一台服务器?

标签 java session servlets load-balancing reverse-proxy

我想知道 Servlet 规范是否提供了一种将 http session 加载到我的 Web 应用程序中的方法。

这个想法很简单:每次连接一个新的http客户端时,都会创建一个新的 session ...我会将这个 session 及其值发送到数据库中(目前这一步很容易做到)。

如果这台“主服务器”挂掉,另一台机器将获取其 IP 地址,因此 http 客户端现在会将其请求发送到这台新机器(我们将其称为“从服务器”)。

在这里,我希望我的从服务器从旧服务器检索 session ...但我不知道 Servlet 规范中的哪种方法可以“添加” session !有办法做到吗?

PS:这是一个大学项目,所以我不能使用 Tomcat 的 mod_jk 等现有模块来实现这个自制的负载平衡器。

编辑:

我认为很多人认为我不使用现有工具是疯了。这是一个大学项目,我必须徒手完成它,以便向我的教授展示我所使用的低级机制。我已经知道在生产中使用我正在做的事情会很疯狂,当这个项目完成时,它将被扔进垃圾桶。 目前,我没有找到一种“标准方法”来使用 Servlet 规范,但我也许可以使用 Manager 来做到这一点。和 Session来自 Tomcat native 类... 如何获取这些接口(interface)的实例?

最佳答案

这不完全是一个新想法,称为 session 复制。有几种方法可以做到这一点。恕我直言,最简单的是(按偏好升序排列):

  1. Jetty's Session clustering with a database
  2. Tomcat's Session clustering 。我个人更喜欢 BackupManager,它确保 session 在任何给定时间点都存在于集群中的 2 个服务器上,并相应地转发客户端。这将 session 复制的网络流量减少到最低限度。
  3. 使用分布式缓存(如 hazelnuts 或 ehcache)进行 session 复制。 jetty 和 Tomcat 都有插件可以做到这一点。由于大多数情况下都会使用缓存,因此这对我来说是最好的解决方案。我倾向于在这样的集群前面放置 2 个循环平衡的清漆服务器,它们具有双重用途:负载平衡集群和提供内存缓存中的静态内容。

对于您的大学项目,我会提交一个具有自动 session 复制功能的嵌入式 jetty ,该 jetty 通过使用 hazelcast 的广播连接到其他服务器。有用,不过分复杂(iirc,你需要实现2个相对简单的接口(interface)),但功能强大。在测试机器前涂上清漆,就可以开始了。

关于java - 如何将现有的 http session 从现有服务器加载到另一台服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26974875/

相关文章:

jsp - 在等待 servlet 转发到下一页时显示加载程序

java - 如何使用java代码在单个数据库中一次连接多个模式

java - java如何解析像[new File ("filename.txt")]这样的相对路径?

java - 如何向java进程提供密码

ios - 我可以通过 Google Analytics 跟踪特定用户 ID 的 session 持续时间吗?

c# - 重置 session 超时而不在 ASP.Net 中进行回发

java - Robolectric 单元测试自定义布局上的 ClassCastException

java - 无法将 SessionVariable 传递给其他流 Mule

java - 如何处理用户创建的图库的私有(private)/公共(public)图片?

android - 将 arraylist 从 servlet 发送到 Android 应用程序