如何保证分布式session一致性?

分析&回答


什么是session?

服务器为每个用户创建一个会话,存储用户的相关信息,以便多次请求能够定位到同一个上下文。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。

什么是session一致性问题?

只要用户不重启浏览器,每次http短连接请求,理论上服务端都能定位到session,保持会话。

1.session复制(同步)

  • 思路:多个web-server之间相互同步session,这样每个web-server之间都包含全部的session
  • 优点:web-server支持的功能,应用程序不需要修改代码
  • 不足:
    • session的同步需要数据传输,占内网带宽,有时延
    • 所有web-server都包含所有session数据,数据量受内存限制,无法水平扩展
    • 有更多web-server时要歇菜

2.客户端存储法

  • 思路:服务端存储所有用户的session,内存占用较大,可以将session存储到浏览器cookie中,每个端只要存储一个用户的数据了
  • 优点:服务端不需要存储
  • 不足:
    • 每次http请求都携带session,占外网带宽
    • 数据存储在端上,并在网络传输,存在泄漏、篡改、窃取等安全隐患
    • session存储的数据大小受cookie限制
      “端存储”的方案虽然不常用,但确实是一种思路。JWT也是不错的选择。

3.反向代理hash一致性

  • 思路:web-server为了保证高可用,有多台冗余,反向代理层能不能做一些事情,让同一个用户的请求保证落在一台web-server上呢?

  • 思路:

    • 方案一:四层代理、反向代理层使用用户ip来做hash,以保证同一个ip的请求落在同一个web-server上
    • 方案二:七层代理hash 反向代理使用http协议中的某些业务属性来做hash,例如sid,city_id,user_id等,能够更加灵活的实施hash策略,以保证同一个浏览器用户的请求落在同一个web-server上
  • 优点:

    • 只需要改nginx配置,不需要修改应用代码
    • 负载均衡,只要hash属性是均匀的,多台web-server的负载是均衡的
    • 可以支持web-server水平扩展(session同步法是不行的,受内存限制)
  • 不足:

    • 如果web-server重启,一部分session会丢失,产生业务影响,例如部分用户重新登录
    • 如果web-server水平扩展,rehash后session重新分布,也会有一部分用户路由不到正确的session
    • session一般是有有效期的,所有不足中的两点,可以认为等同于部分session失效,一般问题不大。

对于四层hash还是七层hash,个人推荐前者:让专业的软件做专业的事情,反向代理就负责转发,尽量不要引入应用层业务属性,除非不得不这么做(例如,有时候多机房多活需要按照业务属性路由到不同机房的web-server)。

4.后端统一集中存储

  • 思路:将session存储在web-server后端的存储层,数据库或者缓存
  • 优点:
    • 没有安全隐患
    • 可以水平扩展,数据库/缓存水平切分即可
    • web-server重启或者扩容都不会有session丢失
  • 不足:增加了一次网络调用,并且需要修改应用代码

对于db存储还是cache,个人推荐后者:session读取的频率会很高,数据库压力会比较大。如果有session高可用需求,cache可以做高可用,但大部分情况下session可以丢失,一般也不需要考虑高可用。

反思&扩展


说说Cookie和Session的区别


喵呜面试助手: 一站式解决面试问题,你可以搜索微信小程序 [喵呜面试助手] 或关注 [喵呜刷题] -> 面试助手 免费刷题。如有好的面试知识或技巧期待您的共享!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喵呜刷题

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值