专栏名称: 架构师之路
架构师之路,坚持撰写接地气的架构文章
目录
相关文章推荐
架构师之路  ·  保证session一致性究的5种方法!(第40讲) ·  2 天前  
51好读  ›  专栏  ›  架构师之路

保证session一致性究的5种方法!(第40讲)

架构师之路  · 公众号  · 架构  · 2025-03-04 11:50

正文

《架构师之路:架构设计中的100个知识点》
40.session一致性

今天系统性和大家聊一聊 session一致性


什么是session?

服务器为每个用户创建一个会话,存储用户的相关信息,以便多次请求能够定位到同一个上下文。
Web开发中,web-server可以自动为同一个浏览器的访问用户自动创建session,提供数据存储功能。最常见的,会把用户的登录信息、用户信息存储在session中,以保持登录状态。
什么是session一致性问题?
只要用户不重启浏览器,每次http短连接请求,理论上服务端都能定位到session,保持会话。
图片
当只有一台web-server提供服务时,每次http短连接请求,都能够正确路由到存储session的对应web-server。
画外音:废话,因为只有一台。
此时的web-server是无法保证高可用的,采用“冗余+故障转移”的 多台web-server来保证高可用时,每次http短连接请求就不一定能路由到正确的session了
图片
如上图,假设用户包含登录信息的session都记录在第一台web-server上,反向代理如果将请求路由到另一台web-server上,可能就找不到相关信息,而导致用户需要重新登录。
在web-server高可用时,如何保证session路由的一致性呢?
常见的,有这么5种方法。
方案一:session同步法。
图片
思路 多个web-server之间相互同步session ,这样每个web-server之间都包含全部的session。
优点 :web-server支持的功能, 应用程序不需要修改代码。
不足
  • session的同步需要数据传输, 内网带宽 ,有时延
  • 所有web-server都包含所有session数据,数据量 受内存限制,无法水平扩展
  • 有更多web-server时要歇菜
方案二:客户端存储法。
图片
思路 :服务端存储所有用户的session,内存占用较大,可以 将session存储到浏览器cookie中 ,每个端只要存储一个用户的数据了。
优点 服务端不需要存储。
缺点
  • 每次http请求都携带session, 外网带宽
  • 数据存储在端上,并在网络传输,存在泄漏、篡改、窃取等 安全隐患
  • session 存储的数据大小受cookie限制
“端存储”的方案虽然不常用,但确实是一种思路。
方案三+方案四:反向代理hash一致性。
思路 :web-server为了保证高可用,有多台冗余,反向代理层能不能做一些事情,让 同一个用户的请求保证落在一台web-server上 呢?
图片
其一,四层代理hash。
反向代理层使用 用户ip来做hash ,以保证同一个ip的请求落在同一个web-server上。
图片

其二,七层代理hash。
反向代理使用http协议中的 某些业务属性来做hash ,例如sid,city_id,user_id等,能够更加灵活的实施hash策略,以保证同一个浏览器用户的请求落在同一个web-server上。
优点
  • 只需要改nginx配置, 不需要修改应用代码
  • 负载均衡 ,只要hash属性是均匀的,多台web-server的负载是均衡的
  • 可以支 持web-server水平扩展
不足
  • 如果web-server重启,一部分session会丢失 ,产生业务影响,例如部分用户重新登录
  • 如果web-server水平扩展, rehash后session重新分布,也会有一部分用户路由不到正确的session
session一般是有有效期的,所有不足中的两点,可以认为等同于部分session失效,一般问题不大。
对于四层hash还是七层hash,个人推荐前者 让专业的软件做专业的事情 ,反向代理就负责转发,尽量不要引入应用层业务属性。
方案五:后端统一存储。
图片
思路 将session存储在web-server后端的存储层 ,数据库或者缓存。
优点
  • 没有安全隐患
  • 可以水平扩展 ,数据库/缓存水平切分即可
  • web-server重启或者扩容都 不会有session丢失






请到「今天看啥」查看全文