分布式session管理实现方案

  • Session复制

在支持Session复制的Web服务器上,通过修改Web服务器的配置,可以实现将Session同步到其它Web服务器上,达到每个Web服务器上都保存一致的Session。

优点:代码上不需要做支持和修改。

缺点:需要依赖支持的Web服务器,一旦更换成不支持的Web服务器就不能使用了,在数据量很大的情况下不仅占用网络资源,而且会导致延迟。

适用场景:只适用于Web服务器比较少且Session数据量少的情况。

可用方案:开源方案tomcat-redis-session-manager,暂不支持Tomcat8

  • Session绑定

将用户的每次请求都通过某种方法强制分发到某一个Web服务器上,只要这个Web服务器上存储了对应Session数据,就可以实现会话跟踪。

优点:使用简单,没有额外开销。

缺点:一旦某个Web服务器重启或宕机,相对应的Session数据将会丢失,而且需要依赖负载均衡机制。

适用场景:对稳定性要求不是很高的业务情景

  • Session集中管理

在单独的服务器或服务器集群上使用缓存技术,如Redis存储Session数据,集中管理所有的Session,所有的Web服务器都从这个存储介质中存取对应的Session,实现Session共享。

优点:可靠性高,减少Web服务器的资源开销。

缺点:实现上有些复杂,配置较多。

适用场景:Web服务器较多、要求高可用性的情况。

可用方案:开源方案Spring Session,也可以自己实现,主要是重写HttpServletRequestWrapper中的getSession方法

  • 基于Cookie管理

这种方式每次发起请求的时候都需要将Session数据放到Cookie中传递给服务端。

优点:不需要依赖额外外部存储,不需要额外配置。

缺点:不安全,易被盗取或篡改;Cookie数量和长度有限制,需要消耗更多网络带宽。

适用场景:数据不重要、不敏感且数据量小的情况

这四种方式,相对来说,Session集中管理更加可靠,使用也是最多的】

Session集中管理方案应该具备的特点

A、中间存储介质的读写速度要快。之前的Session管理方案将Session对象存放在服务器内存中,有着很高的读写速度,进行Session集中管理后将会在Session读写中引入网络传输,速度会有所降低,所以必须保证中间存储介质的读写速度。

B、中间存储介质要保证高可用。进行Session集中管理后,整个企业应用的Session都会存放在中间存储介质中,如果存储介质是不稳定的,那整个企业应用都将不稳定。

C、对Session的使用者来说,Session管理方案应该是透明的,切换成集中管理方案后用户无感知。

D、Session管理方案不该和某一Web服务器耦合,应该适用于所有常规Web服务器。

根据上述标准可以看出,Session集中管理方案的技术选型应该从Session存储介质和管理方案实现两方面考虑。

管理方案实现

目前常用的Session集中管理方案有两种,一种是Memcache-Tomcat-Session,另一种是Spring Session。

Memcache-Tomcat-Session是一个基于Memcache和Tomcat实现Session集中管理的开源方案。通过扩展Tomcat的SessionManager,并且在配置文件中替换Tomcat默认的SessionManager来实现Session管理。虽然实现起来比较简单,但是与Tomcat耦合,不适用于其他Web服务器。

详见 ——《大型分布式网站架构设计与实践》2.1.3

Spring Session是Spring提供的一套Session管理方案,通过一个SessionFilter将所有请求进行拦截,然后使用Request包装类来接管Session管理。Spring Session不与Web服务器耦合,能够适用于常规的服务器。同时还提供了统一浏览器多Session等功能。

Spring Session虽然优点颇多,但是实现Session管理功能的代码量也比较大,还需要配合Spring-data-redis使用,学习成本比较大,遇到问题不好维护

基于缓存的分布式Session架构

参考资料

https://www.jianshu.com/p/3dd4e06bdfa4

results matching ""

    No results matching ""