【问题标题】:Clustered Environment and Session Management (Servlets)集群环境和会话管理 (Servlet)
【发布时间】:2012-04-09 09:14:58
【问题描述】:

我在阅读一本关于 Java Servlets 的书时遇到了HTTPSessionActivationListener。规定在集群环境中,只能有一个包含特定会话 ID 的 HTTPSession 对象。假设一个集群中有 2 个节点 A 和 B -

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

在这种情况下,会话对象和属性是否应该是可序列化的?如果它不可序列化会怎样?

为了统计活跃会话的数量,是否应该将两个节点中的会话相加得到实际值?这通常是怎么做的?

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

【问题讨论】:

    标签: servlets cluster-computing


    【解决方案1】:

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

    【讨论】:

    • 感谢 Kevin - 提供了很好的见解。如果应用程序服务器出现故障,我猜会话将在粘性会话功能的情况下丢失。将会话数据存储在共享存储库中 - 可以使用配置来实现,还是应该由应用程序开发人员编码?我在您提供的链接中看到,应用开发者必须进行相关更改。
    • 通常会通过 cookie 返回会话 id,该会话 id 用于在存储中查找数据。我认为这就是所有自定义应用程序逻辑(如果您使用的是 spring,您会将代码放入拦截器中)。
    • 你所说的应用服务器宕机也是正确的——并且是粘性会话的限制。
    【解决方案2】:

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

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

    【讨论】:

    • 谢谢@yathirigan!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-28
    • 1970-01-01
    • 2016-12-25
    • 1970-01-01
    • 2014-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多