主题
面试速答(先看这里)
**一句话结论:**客户端存储 :用户登录后,将Session信息保存在客户端,用户在每次请求的时候,通过客户端的cookie把session信息带过来。
60秒标准回答:
在分布式系统中,我们的应用可能是以集群形式对外提供服务的,有可能出现在A服务器登录后,用户下一次访问的时候请求到B服务器,就需要有一个分布式的Sesssion来告诉B服务器用户是登录过的,并且需要拿到用户的登录信息
在业内,实现分布式Session通常有以下几个方案
客户端存储 :用户登录后,将Session信息保存在客户端,用户在每次请求的时候,通过客户端的cookie把session信息带过来。这个方案因为要把session暴露给客户端, 存在安全风险
**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点
回答主线:
- **要点1:**在分布式系统中,我们的应用可能是以集群形式对外提供服务的,有可能出现在A服务器登录后,用户下一次访问的时候请求到B服务器,就需要有一个分布式的Sesssion来告诉B服务器用户是登录过的,并且需要拿到用户的登录信息。
- **要点2:**在业内,实现分布式Session通常有以下几个方案:
- **要点3:**基于分布式存储(最常用) :将Session数据保存在分布式存储系统中,如分布式文件系统、分布式数据库等。
- **要点4:**粘性Session :这个方案指的是把一个用户固定的路由到指定的机器上,这样只需要这台服务器中保存了session即可,不需要做分布式存储。
- **要点5:**Session复制 :当用户的Session在某个服务器上产生之后,通过复制的机制,将他同步到其他的服务器中。
**记忆锚点:**Session → session → Spring → Redis → cluster-howtohtml → tomcatapacheorg
关键取舍:
- 这个方案的缺点是有 可能有延迟 。
易错提醒:
- 这个方案因为要把session暴露给客户端, 存在安全风险。
追问准备:
- 围绕「Session」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「session」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「Spring」:底层原理是什么?使用时有哪些边界和常见坑?
- 如果线上出现异常,你会如何定位、验证并规避?
扩展知识
在分布式系统中,我们的应用可能是以集群形式对外提供服务的,有可能出现在A服务器登录后,用户下一次访问的时候请求到B服务器,就需要有一个分布式的Sesssion来告诉B服务器用户是登录过的,并且需要拿到用户的登录信息。
在业内,实现分布式Session通常有以下几个方案:
客户端存储:用户登录后,将Session信息保存在客户端,用户在每次请求的时候,通过客户端的cookie把session信息带过来。这个方案因为要把session暴露给客户端,存在安全风险。
基于分布式存储(最常用):将Session数据保存在分布式存储系统中,如分布式文件系统、分布式数据库等。不同服务器可以共享同一个分布式存储,通过Session ID查找对应的Session数据。唯一的缺点就是需要依赖第三方存储,如Redis、数据库等。
粘性Session:这个方案指的是把一个用户固定的路由到指定的机器上,这样只需要这台服务器中保存了session即可,不需要做分布式存储。但是这个存在的问题就是可能存在单点故障的问题。
Session复制:当用户的Session在某个服务器上产生之后,通过复制的机制,将他同步到其他的服务器中。这个方案的缺点是有可能有延迟。
Tomcat支持Session复制,配置方式可以参考官方文档:https://tomcat.apache.org/tomcat-8.0-doc/cluster-howto.html
Spring中也提供了对Session管理的支持——Spring Session,他集成了很多Session共享的方案,如基于Redis、基于数据库等。