我想在一个配置中运行我的tomcat-instances,通过循环将请求提供给多个tomcat-instance。我不想使用任何内部集群管理器。
据我所知,每个请求是否由不同的tomcats提供服务,未知的sessionId将到达tomcat,因此它将被强制创建一个新会话并覆盖旧的sessionId。因此,对于每个请求,都将创建一个新会话。这似乎是很多开销。
我对这些事情的看法是对的吗?有没有办法禁用tomcats会话管理?
此致 迈克尔
答案 0 :(得分:3)
基本上你有两个选择:
1)复制会话,以便任何Tomcat节点都可以访问它们。解决方案:Tomcat Cluster,memcached-session-manager,可能是其他解决方案。
2)使用负载均衡器并实施粘性会话。第一个请求将以循环方式随机路由,但后续请求将保留在同一服务器上。解决方案:mod_proxy,硬件流量管理器。
第一个选项的缺点是会话复制成本高,不太可靠,通常需要Serializable
- 只能将数据放入会话中。
第二种方法的缺点是,如果关闭Tomcat进行维护,用户将被迫再次登录。
您错误地认为“对于每个请求都会创建一个新会话”。只有在以前没有在同一台服务器上创建新会话,或者创建新会话但已经过期时,才会创建新会话。
答案 1 :(得分:1)
我们通常在具有mod_jk
的Apache Web服务器后面使用Tomcat来对Tomcat实例中的请求进行负载平衡。
使用sticky sessions,用户只能在第一次请求时获得会话,之后将始终定向到其会话发起的Tomcat。因此,不需要在所有Tomcats中复制会话,并且请求也将分布在Tomcats中。
当然,这并不能确保你要求的某种循环法。
答案 2 :(得分:-1)
只有在您的代码请求会话时才会创建会话,因此如果您的应用程序不需要会话,那么只是不要访问它。查看HttpServletRequest中的getSession()部分
我不确定是否有办法在不同的tomcat实例之间复制会话,但是如果你需要一些没有会话的用户状态,那么你可以改用cookie。
编辑:如果你确实需要复制会话,你可以从阅读这个tomcat文档开始。 http://tomcat.apache.org/tomcat-5.5-doc/cluster-howto.html