业务背景
在web应用中,为了应对大规模访问,必须实现应用的集群部署.要实现集群部署主要需要实现session共享机制,使得多台应用服务器之间会话统一,weblogic tomcat等多数主流web服务器都采用了session复制以及实现session的共享. 但问题是很明显的:在节点持续增多的情况下,session复制带来的性能损失会快速增加。特别是当session中保存了较大的对象,而且对象变化较快时,性能下降更加显著。这种特性使得web应用的水平扩展受到了限制。session共享的另一种思路就是把session集中起来管理,首先想到的是采用数据库来集中存储session,但数据库是文件存储相对内存慢了一个数量级,同时这势必加大数据库库系统的负担。并且session里面的数据结构是MAP类型,和分布式缓存的MAP数据结构天然匹配。
业务要求
- 良好的扩展性,100个节点以上web服务器;
- Session操作的性能能横向扩展,容量横向扩展;
- 共享session数据支持超时机制
需求分析
天翼云分布式缓存单分组支持1000个web服务器*100个线程以上的连接池连接、后端redis存储节点支持1000个redis节点水平扩展,存储容量最大可支持500TB、支持按key设置超时时间
实现思路:通用实现思路,与web容器选型无关
- 使用filter拦截cookie中的sessionId,通过sessionId构造新的HttpServletRequestWrapper对象,传给后面的应用;
- 继承重构HttpServletRequestWrapper,HttpSessionWrapper类,覆盖原来和session存取相关的方法,都通过SessionService类来实现;
- 使用HttpSessionSidWrapper实现httpsession接口,对容器的session的属性存取操作进行包装;
- Session对象 map<String,object>,缓存中是 map<String,byte[]>,需要把session中的object序列化成byte[] 。