细说分布式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集中管理更加可靠,使用也是最多的。

全部评论
这么快就加上了?
点赞 回复 分享
发布于 2017-09-08 15:23

相关推荐

04-02 13:46
门头沟学院 Java
美团二面2099人在聊 查看15道真题和解析
点赞 评论 收藏
分享
04-26 18:00
已编辑
东莞市技师学院 Java
AI辅助学习,用啥AI辅助学习?AI辅助学习出现了啥问题?一条Http的输入到输出流程什么是CDN说一下集群下怎么统一管理用户的Session状态JWT+Localstorage,Redis统一管理状态为什么要用Redis统一管理JWT?我直接客户端存一个UUID,然后Redis存用key-value,key是UUID,Value是用户信息不就行了?为什么一定要JWT?(牛mode,我能本地ThreadLocal解析出用户信息我还要用ThreadLocal存用户信息然后去Redis拿?)可能面试官是用Session的还是不懂JWT,一直盯着我的JWT喷final,Byte【】反射,属性不可变多线程去对i进行++操作他是少加还是漏加?可以用原子类来解决也就是安全计数器,底层被Synchronized修饰了Redisson,分布式锁AOP,AOP失效场景,如何解决AOP失效场景,详细的失效场景,事务的嵌套调用线程池的意义,为什么说创建线程会有开销,具体是什么开销。我都说到CPU共享时间片了,降低效率,浪费时间片轮转的时间线程池执行流程,拒绝策略,一般用什么拒绝策略? 如果线程池的队列满了并且到了最大线程数该怎么办?从这里开始他莫名其妙转牛角尖压力我了自定义拒绝策略+Mysql+定时任务兜底,利用Kafka的持久化机制防止消息丢失他说我说的不对?我说你实在不想队列满,你就弄个LinkedQueue无界队列,理论上就不会满了,也可以用Kafka理论上是无限大的从这开始他就莫名其妙说我了,你先别说Kafka你先说回前面的《理论上不会满那实际不会满吗?》我说实际如果太多会OOM,如果你想防止OOM可以用Kafka,Kafka理论上是无限大的《又是理论上吗》我说LinkedQueue最大长度10的九次方,理论上怎么可能会满?他说现在就有一个业务有10的九次方个任务呢?从这开始就不知道他的目的是问啥了,因为消息丢失,队列转型我都答了我不知道他让我回答一个业务有10的九次方个任务呢是干嘛a,b,c联合索引索引分类,模糊匹配,ES,倒排索引方法幂等性(这个我蠢了忘了setIfAbsent是原子性的)我就答了上锁固定时间,让ml的历史报文丢失布隆过滤器(马丁最蠢的一个东西),你为什么要这样设计呢?那我要是商标注册就是要准确找到是否存在呢?你这是为了上技术而上技术,乱用(对不起我承认)然后他沉默了一分钟很不爽,《你这样子设计根本就没考虑开销》别骂我了,我以后再也不用马丁星球的任何东西了,我也知道是屎但我个人项目没啥东西了SSE,GPT3.5,WebSocket我反问他对我有什么建议,他说你觉得自己怎么样(WTF,我也就一个幂等性没答出来),他说除了一个其他也错的离谱我问他哪里错的离谱,他说你自己去看吧,刚刚面的那么多,后面我继续问哪里错了?他说不记得了,反正错的离谱?WTF?WTF?WTF?错的离谱?JWT管理我没说错啊,LinkedQueue无界队列不知道他是急了还是啥能问出《现在就有一个业务有10的九次方个任务呢?》,我去可能他在jwt那里就没理解我说的,无所谓了我也就一个幂等性没答出来而且我不懂为啥要用一个UUID作为Key然后用户信息作为Value去存用户信息,感觉这里是为了反驳jwt的设计而反驳了可能干全栈的喜欢用Session吧不懂,休息去了感觉面试官是为了黑我而黑我,最后我让他对我提出建议,他说我有很大的问题,我说具体在哪,他说他忘了😂😂😂让我回去自己想想难绷的一比😂😂,如果我真有大问题他肯定记得很清楚吧,因为某技术点就把个人情绪带进来南蚌南蚌,这个面试官看不爽把我挂了我要笑死了#面经# #实习# #牛客在线求职答疑中心# #牛客创作赏金赛# #对不起# #牛客AI配图神器#
点赞 评论 收藏
分享
评论
点赞
18
分享

创作者周榜

更多
牛客网
牛客企业服务