2012-03-25 89 views
2

我正在读一本关于Java Servlets的书,在那里我遇到了HTTPSessionActivationListener。指定在集群环境中,只能有一个包含特定会话标识的HTTPSession对象。假设群集中有2个节点A和B-集群环境和会话管理(Servlets)

第一个请求会发送到节点A.此处将创建一个HTTPSession S1以及会话属性,并将响应返回给客户端。 同一客户端发送后续请求。这个请求进入节点B.现在会话对象S1从节点A移动到节点B(在节点B中激活并在节点A中钝化)。

在这种情况下会话对象应该与属性一起是可序列化的吗?如果它不可序列化会发生什么?

为了统计活动会话的数量,是否应将两个节点中的会话相加以获取实际值?这通常如何完成?

另外我想ServletContext是唯一的每个JVM。在集群的所有节点中,属性是否被设置为servletcontext的一部分复制到servlet上下文中?

回答

2

通常我见过人们使用粘性会话(通常由负载平衡器提供,例如ec2 ELB具有此功能:http://shlomoswidler.com/2010/04/elastic-load-balancing-with-sticky-sessions.html),或者会话数据存储在共享存储库中,例如数据库或NoSQL存储。

+0

感谢凯文 - 提供了一个很好的见解。如果应用程序服务器发生故障,我猜如果发生粘滞会话功能,会话将会丢失。将会话数据存储在共享库中 - 是否可以使用配置来实现,或者应该由应用程序开发人员编码?我在链接中看到,您提供的应用程序开发人员必须进行相关更改。 – 2012-03-25 18:19:34

+0

通常会通过cookie返回会话ID,并使用该会话ID查找商店中的数据。这就是所有的自定义应用逻辑,我认为(如果你使用spring,你会把代码放在拦截器中)。 – Kevin 2012-03-25 18:55:33

+0

您对应用程序服务器关闭的说法也是正确的 - 并且是会话粘性的限制。 – Kevin 2012-03-25 18:56:35

1

春季会议似乎提供了一种名为“集群会话”的功能,它还具有将会话卸载到RedIs或GemFire缓存解决方案的功能。

参考:http://projects.spring.io/spring-session/

+0

谢谢@yathirigan! – 2016-09-22 14:06:33