分布式session

简介: 1.什么是sessionHTTP是无状态的,session是一种会话保持技术,目的就是以一种方式来记录http请求之间需要传递、交互的数据。不是每次http请求都会产生的新的session,而是在服务端手动创建的,例如HttpServletRequest.getSession(true)。session创建后会返回给客户端sessionID,sessionID会以cookie的形式携带在后续的请求中,直到浏览器关闭,一次会话结束。

1.什么是session

HTTP是无状态的,session是一种会话保持技术,目的就是以一种方式来记录http请求之间需要传递、交互的数据。

不是每次http请求都会产生的新的session,而是在服务端手动创建的,例如HttpServletRequest.getSession(true)。


session创建后会返回给客户端sessionID,sessionID会以cookie的形式携带在后续的请求中,直到浏览器关闭,一次会话结束。

5ce3180714024eb09925d38b0768a098.png

详细的关于session以及其他会话保持技术的内容可参见博主的另一篇文章:

会话保持技术:cookie、session__BugMan的博客-CSDN博客

2.session共享问题

由于session是存储在单个的web server中,在分布式的环境下会存在全局不共享的问题,访问A服务器创建的session,后续请求负载均衡到B服务器上后肯定是无法找到该session的。


session共享有以下解决方案:


session复制同步


session存在客户端


一致性hash


统一存储

2.1.session复制同步

995e0ecad7a34cddb04f832563b474f3.png

web server间以复制的方式进行session的同步,每个web server节点都有存放着全局的所有session。缺点是太浪费存储空间,复制的速度也很慢,不高效。

2.2.存在客户端

存在客户端会导致后续请求的数据包变大,浪费带宽,并且存在被篡改和破解的风险。

2.3.一致性hash

b8c13d85572a4f71941eaaece348af5c.png

通过一致性hash算法将相同IP的请求负载均衡到同一个服务器,这样也能避免session不共享带来的问题。


关于一致性hash博主的另一篇文章有对其有详细论述:一致性hash算法__BugMan的博客-CSDN博客


缺点:


web server重启session会丢失


web server水平拓展后全局需要rehash,后续的一些请求会找不到正确的路由。


不过以上缺点都是能接受的代价,因此一致性hash是个解决分布式场景下session不共享问题的好办法。

2.4.统一存储

b5aeabbc32ed414eaa74d86031c16765.png

将本来想存在session里的数据存在第三方存储如Redis中。


缺点:


额外增加了一次网络调用


如果是已经写好了的老项目进行改造的话,还需要在编码里把所有session操作都改为对第三方存储的操作。


Spring也注意到了这个问题,提供了SpringSession框架,以上缺点使用SpringSession框架,都可以完美解决。

目录
相关文章
|
4月前
|
存储 负载均衡 NoSQL
分布式Session
分布式Session
40 0
|
4月前
|
存储 缓存 负载均衡
分布式系统Session一致性问题
分布式系统Session一致性问题
65 0
|
4月前
|
负载均衡 算法 NoSQL
聊聊分布式应用中负载均衡技术和Session一致性
聊聊分布式应用中负载均衡技术和Session一致性
68 0
|
10月前
|
负载均衡 算法 NoSQL
分布式系列教程(15) - 解决分布式Session一致性问题
分布式系列教程(15) - 解决分布式Session一致性问题
88 0
|
存储 缓存 NoSQL
Shiro 解决分布式 Session
在分布式系统中,会话管理是一个重要的问题。Shiro框架提供了一种解决方案,通过其会话管理组件来处理分布式会话。本文演示通过RedisSessionManager解决分布式会话问题。
83 0
|
存储 NoSQL Java
Spring Session分布式会话管理
Spring Session分布式会话管理
86 0
|
3月前
|
NoSQL Java 应用服务中间件
大厂面试必备:如何轻松实现分布式Session管理?
这篇文章介绍三种分布式Session的实现方案:基于JWT的Token、基于Tomcat的Redis和基于Spring的Redis。JWT方案通过生成Token存储用户信息,实现无状态、可扩展的会话管理,但可能增加请求负载且数据安全性较低。Tomcat与Redis结合,通过配置Tomcat和Redis,实现Session集中管理和高性能存储,但配置相对复杂。Spring整合Redis适用于SpringBoot和SpringCloud项目,集成方便,扩展性强,但同样依赖外部Redis服务。每种方法有其优缺点,适用场景不同。作者小米是一个技术爱好者,欢迎关注其微信公众号“软件求生”获取更多技术内容
176 4
|
7天前
|
存储 NoSQL Java
使用springSession完成分布式session
本文介绍了如何使用 `spring-session` 实现分布式 Session 管理,并提供了将 Session 存储在 Redis 中的具体配置示例。通过配置相关依赖及 Spring 的配置文件,可以轻松实现 Session 的分布式存储。示例中详细展示了所需的 Maven 依赖、Spring 配置及过滤器配置,并给出了启动项目后在 Redis 中查看 Session 数据的方法。
|
1月前
|
存储 NoSQL Java
一天五道Java面试题----第十一天(分布式架构下,Session共享有什么方案--------->分布式事务解决方案)
这篇文章是关于Java面试中的分布式架构问题的笔记,包括分布式架构下的Session共享方案、RPC和RMI的理解、分布式ID生成方案、分布式锁解决方案以及分布式事务解决方案。
一天五道Java面试题----第十一天(分布式架构下,Session共享有什么方案--------->分布式事务解决方案)
|
3月前
|
存储 缓存 算法
分布式Session共享解决方案
分布式Session共享解决方案
39 0

热门文章

最新文章