Java for Web学习笔记(二十):Session(4)在集群中使用Session
来源:互联网 发布:吴裕泰茶叶推荐 知乎 编辑:程序博客网 时间:2024/05/22 09:47
在集群中使用session
Sticky Sessions
在集群的情况下,可以采用保证同一个seesion都到同一个web container中处理的方式,即sticky sessions,有不同方式,例如load balance作为agent使用自己的cookie,因此可以更方便地辨识。在SSL/HTTPS的情况下,会无法获取session ID,可以将加解密放在load balance,例如NGINX,但这样就无法使用SSL Session ID作为HTTP Session ID。
支持Sticky Session的load balance有Apache HTTPD[1]和Microsoft IIS web server。如果数据量很大,可以在多个Apache HTTPD之前再部署一个轮询的load balance。
一个由4台web containers(4个tomcatinstance)组成的集群。在ApacheHTTPD中connector使用一个Tomcat概念session ID jvmroute(大抵根据session ID进行路由之意),每个tomcat instance应该在conf/server.xml中对<Connector>进行jvmroute配置,例如:<Engine name="Catalina" defaultHost="localhost" jvmRoute="tm02">。这个配置作为session ID的后缀,例如分布配置为tm01,tm02,tm03,tm04,那么有配置为tm02所产生的session ID为:AA64E92624FFEA976C4148DF5BC6BA03.tm02。前面的Apache Tomcat Connectors 根据后缀tm02,知道session归属那个tomcat instance进行处理。对于要求HTTPS,证书和编解码都放在Apache HTTPD中进行处理,可以获取SSL Session ID并转换为tomcat的HTTP Session ID。
复制session信息
Sticky Session的方式可以解决扩展性,但是不能解决可用性,如果某台tomcat坏了,那么在那台tomcat上的session就会丢失,用户可能有些数据没有保存。因此我们需要在其他tomcat上给出这个session信息复制,这样,当某天tomcat坏了,分配到其他tomcat,session也能继续有效。
配置上比较简单,在tomcat的server.xml中添加以下配置,告之需要将session复制到集群的其他机器上。
<distributable />
在session可以存储任何的数据,只受限于下面两个方面:
一、存储的数据态度,会消耗虚拟机的内存池
二、如果server采用集群的方式,需要将对象序列化(serialize,通过Serializable接口),并传播给整个集群。
因此session中存放的对象必须是Serializable,否则在复制过程中会报IllegalArgumentException的错误,此外必须通过setAttribute来触发负责。下面是一个小例子:
@SuppressWarnings("unchecked")Map<Integer, Integer> cart = (Map<Integer, Integer>)session.getAttribute("cart");if(!cart.containsKey(productId)) cart.put(productId, 0);cart.put(productId, cart.get(productId) + 1);session.setAttribute("cart", cart); //必须要加上此句,才能将修改后的session内容复制到集群的其他机器
有一个javax.servlet.http.HttpSessionActivationListener和session的复制有关。当一个session进行准备Serialize并复制到其他机器,触发sessionWillPassivate()。当session在其他的container中deserialized时,sessionDidActivate()被触发。
最后,强调一下,Sticky sessions和session复制这两种方式不是二选一的,相反,是通常一起使用的。
[1] 参见:http://tomcat.apache.org/connectors-doc/
相关链接: 我的Professional Java for Web Applications相关文章
- Java for Web学习笔记(二十):Session(4)在集群中使用Session
- Java for Web学习笔记(十八):Session(2)Session的使用
- Java for Web学习笔记(十七):Session(1)Session的携带
- Java for Web学习笔记(十九):Session(3)Session Listener
- Java for Web学习笔记(七二):Service和Repository(7)在Spring框架中使用WebSocket
- 在web项目中使用session传递错误信息(草稿)
- Java for Web学习笔记(十五):JSP(5)在JSP中使用Java吗?
- php学习笔记(二十六)php中session的初步使用(基于cookie的)
- php学习笔记(二十七)php中session的使用(基于url的)
- NSURLSession学习笔记(二)Session Task
- NSURLSession学习笔记(二)Session Task
- NSURLSession学习笔记(二)Session Task
- NSURLSession学习笔记(二)Session Task
- NSURLSession学习笔记(二)Session Task
- NSURLSession学习笔记(二)Session Task
- NSURLSession学习笔记(二)Session Task
- NSURLSession学习笔记(二)Session Task
- NSURLSession学习笔记(二)Session Task
- curl命令
- node系统OS
- VS uses /CreateAdminFile to generate AdminDeployment.xml
- 多线程put后可能导致get死循环
- 客户端连接oracle的总结(关于tnsname和监听)
- Java for Web学习笔记(二十):Session(4)在集群中使用Session
- C#中dynamic的正确用法
- oracle配置
- URL重定向 UrlRewrite
- 分布式文件系统 fastdfs 源码分析 之 文件上传流程分析
- Storm整合HDFS
- 简单的改变元素样式
- Docker是用来干什么的?
- VF01-billing拆分逻辑详解