浅谈分布式Session管理

随着Web应用系统架构的不断升级,对Session管理的需求也变得越来越高。本篇将详细总结分布式部署环境下的Session管理。

为什么要使用分布式Session

Web应用在单机部署的情况下,Session是被单个应用服务器存储管理的,由于只有一个应用服务器,用户的所有请求都是通过它进行响应处理的,所以能够很容易实现会话跟踪和保持。随着业务量的增长,系统架构需要做出调整以适应发展的需要,可能会使用分布式架构或微服务架构,无论使用哪种架构方式,应用系统单机部署的模式已经不能满足需求,所以会将应用系统部署到多台应用服务器上,用户的请求也会通过负载均衡转发到某个具体应用服务器上执行,可能会出现在A1系统登录后创建并保存Session,再次发起请求,请求被转发到A2系统上显示未登录的情况,此时单机部署模式下的Session机制已不能满足要求。所以,在分布式架构或微服务架构下,必须保证一个应用服务器上保存Session后,其它应用服务器可以同步或共享这个Session。

分布式session管理实现方案

分布式Session有如下几种实现方式。

1.Session复制

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

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

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

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

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

2.Session粘滞

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

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

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

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

3.Session集中管理

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

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

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

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

可用方案:开源方案Spring Session,也可以自己实现,主要是重写HttpServletRequestWrapper中的getSession方法,博主也动手写了一个,github搜索joincat用户,然后自取。

4.基于Cookie管理

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

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

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

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

总结

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

原文发布于微信公众号 - JavaQ(Java-Q)

原文发表时间:2017-08-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏哲学驱动设计

性能优化总结(四):预加载的设计

    本节说一下数据的预加载。这节的内容与SQL没什么关系。主要说的是在 GIX4项目 中,我们是如何设计符合需求的预加载类库的。内容如下: 什么是预加载,为...

2415
来自专栏编程

用python搭个web服务器玩玩(一)

如果你想成为一个优秀的开发者,你应该对日常使用的软件系统的内部结构有深入的理解,包括编程语言、数据库及操作系统、Web 服务器及 Web 框架。而且,为了更好更...

4329
来自专栏IT笔记

Consul+Prometheus系统监控之注册发现

缘起 前面几篇文章分别对系统服务、MySql以及Redis相关软件做了监控预警,但是大家有没有发现,在prometheus.yml里配置需要监听的服务时,我们需...

2.7K6
来自专栏北京马哥教育

10个方法助你轻松完成Linux系统恢复

在Linux中有一些应用程序可以帮助你保存系统快照。大多数应用程序都是针对于新手的,并不需要高级的Linux操作技巧。我们在这里挑选了10个,你可以从中选择适合...

5205
来自专栏黑白安全

Git 曝任意代码执行漏洞,所有使用者都受影响

Git 由于在处理子模块代码库的设置档案存在漏洞,导致开发者可能遭受任代码执行攻击,多数代码托管服务皆已设置拒绝有问题的代码储存库,但建议使用者尽快更新,避免不...

731
来自专栏杨建荣的学习笔记

搭建知识库xwiki

之前自己使用Django admin和suit完成了初步的个人知识库管理,基本完成了我自己的浏览器标签库和微信公众号的统一管理,但是有一个问题,那就是目前我只能...

6265
来自专栏Albert陈凯

VMWare安装Linux操作系统CentOS

上篇文章我们介绍了如何在Windows操作系统中安装VMWare软件,并创建一个虚拟机,链接地址:http://www.jianshu.com/p/6b589e...

2754
来自专栏云计算教程系列

Prometheus升级指南

Prometheus是一个基于Metrics的监控系统 ,与Kubernetes同属CNCF(Cloud Native Computing Foundation...

1K2
来自专栏张尧博客

macOS High Seirra 提示“已损坏,打不开,您应该将它移至垃圾篓。”

2957
来自专栏idba

基于consul的Redis高可用方案

这几天在研究如何做Redis的高可用容灾方案,查询了资料和咨询DBA同行,了解到Redis可以基于consul和sentinel实现读写分离以及HA高可用方案。...

2941

扫码关注云+社区

领取腾讯云代金券