如何将现有http会话从现有服务器加载到另一台服务器?

时间:2014-11-17 14:27:08

标签: java session servlets load-balancing reverse-proxy

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

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

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

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

PS:这是一个大学项目,所以我不能使用已经存在的模块,如Tomcat的mod_jk这个自制的负载均衡器。

编辑:

我认为很多人都认为我不会使用已有的工具。这是一个大学项目,我必须用我的赤手来实现它,以便向我的教授们展示我所使用的低级机制。我已经知道在生产中使用我正在做的事情会很疯狂,当这个项目完成后,它将被抛入垃圾箱。 目前,我没有找到使用Servlet规范的“标准方法”,但我可以使用来自Tomcat本地类的ManagerSession来实现... 如何获取这些接口的实例?

2 个答案:

答案 0 :(得分:1)

这不是一个新想法,称为会话复制。有几种方法可以做到这一点。最简单的imho(按优先顺序排列):

  1. Jetty's Session clustering with a database
  2. Tomcat's Session clustering。我个人更喜欢BackupManager,它确保会话在任何给定时间点都存在于群集中的2台服务器上,并相应地转发客户端。这会将会话复制的网络流量降至最低。
  3. 使用分布式缓存(如榛子或ehcache)进行会话复制。有jetty和Tomcat的插件可以做到这一点。由于大多数情况下都使用缓存,这对我来说是最好的解决方案。我倾向于在这样的集群前面放置2个循环平衡清漆服务器,它们起到了双重作用,即负载平衡集群并从内存缓存中提供静态内容。
  4. 至于你的大学项目,我会使用自动会话复制交换嵌入式码头,通过使用hazelcast广播连接到其他服务器。有用,而不是过于复杂(iirc,你需要实现2个相对简单的接口),但功能强大。在你的测试机器前放一块清漆,你应该好好去。

答案 1 :(得分:0)

所有主要的Java EE应用服务器供应商都支持此功能,因此您不应该自己实现任何功能。正如Markus所写,它被称为会话复制或会话持久性。您可以查看可免费用于开发的WebSphere Liberty。它支持开箱即用,无需实现任何功能。你只需要: