究竟如何保证session一致性?

有位星球水友提问:

如何保证session一致性?

这个问题太泛了,今天系统性讲讲session常见的N种方案,不知道是不是兄弟你想要的。

 

什么是session?

服务器为每个用户创建一个会话,存储用户的相关信息,以便多次请求能够定位到同一个上下文。
 
Web开发中,web-server可以自动为同一个浏览器的访问用户自动创建session,提供数据存储功能。最常见的,会把用户的登录信息、用户信息存储在session中,以保持登录状态。
 
什么是session一致性问题?
只要用户不重启浏览器,每次http短连接请求,理论上服务端都能定位到session,保持会话。
究竟如何保证session一致性?
当只有一台web-server提供服务时,每次http短连接请求,都能够正确路由到存储session的对应web-server。
画外音:废话,因为只有一台。
 
此时的web-server是无法保证高可用的,采用“冗余+故障转移”的多台web-server来保证高可用时,每次http短连接请求就不一定能路由到正确的session了
究竟如何保证session一致性?
如上图,假设用户包含登录信息的session都记录在第一台web-server上,反向代理如果将请求路由到另一台web-server上,可能就找不到相关信息,而导致用户需要重新登录。
 
在web-server高可用时,如何保证session路由的一致性呢?
 
二、session同步法
究竟如何保证session一致性?
思路多个web-server之间相互同步session,这样每个web-server之间都包含全部的session。
 
优点:web-server支持的功能,应用程序不需要修改代码。
 
不足
  • session的同步需要数据传输,内网带宽,有时延
  • 所有web-server都包含所有session数据,数据量受内存限制,无法水平扩展
  • 有更多web-server时要歇菜
 
三、客户端存储法
究竟如何保证session一致性?
思路:服务端存储所有用户的session,内存占用较大,可以将session存储到浏览器cookie中,每个端只要存储一个用户的数据了。
 
优点服务端不需要存储。
 
缺点
  • 每次http请求都携带session,外网带宽
  • 数据存储在端上,并在网络传输,存在泄漏、篡改、窃取等安全隐患
  • session存储的数据大小受cookie限制
 
“端存储”的方案虽然不常用,但确实是一种思路。
 
三、反向代理hash一致性
思路:web-server为了保证高可用,有多台冗余,反向代理层能不能做一些事情,让同一个用户的请求保证落在一台web-server上呢?
究竟如何保证session一致性?
方案一:四层代理hash
反向代理层使用用户ip来做hash,以保证同一个ip的请求落在同一个web-server上。
 
究竟如何保证session一致性?
方案二:七层代理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一致性?
思路将session存储在web-server后端的存储层数据库或者缓存
 
优点
  • 没有安全隐患
  • 可以水平扩展,数据库/缓存水平切分即可
  • web-server重启或者扩容都不会有session丢失
 
不足:增加了一次网络调用,并且需要修改应用代码。
 
对于db存储还是cache,个人推荐后者:session读取的频率会很高,数据库压力会比较大。如果有session高可用需求,cache可以做高可用,但大部分情况下session可以丢失,一般也不需要考虑高可用。
 
五、总结
保证session一致性架构设计常见方法:
  • session同步法:多台web-server相互同步数据
  • 客户端存储法:一个用户只存储自己的数据
  • 反向代理hash一致性:四层hash和七层hash都可以做,保证一个用户的请求落在一台web-server上
  • 后端统一存储:web-server重启和扩容,session也不会丢失
 
对于方案3和方案4,个人建议推荐后者
  • web层、service层无状态是大规模分布式系统设计原则之一,session属于状态,不宜放在web层
  • 让专业的软件做专业的事情,web-server存session?还是让cache去做这样的事情吧

发布者:糖太宗,转载请注明出处:https://www.qztxs.com/archives/science/technology/6559

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022年5月14日 上午12:45
下一篇 2022年5月14日 上午12:48

相关推荐

  • Redis为什么这么快? Redis底层实现原理

    前言 说起当前主流NoSql数据库非 Redis 莫属。因为它读写速度极快,一般用于缓存热点数据加快查询速度,大家在工作里面也肯定和 Redis 打过交道,但是对于Redis 为什么快,除了对八股文的背诵,好像都还没特别深入的了解。 今天我们一起深入的了解下redis吧: 高效的数据结构 Redis 的底层数据结构一共有6种,分别是,简单动态字符串,双向链表...

    2022年5月19日
    3100
  • 这个排序这么酷,为什么知道的人很少?

    有一种很神奇的排序,基数排序(Radix Sort),时间复杂度为O(n),今天花1分钟,通过几幅图,争取让大家搞懂细节。 画外音:居然还有时间复杂度为O(n)的排序算法?不但有,其实还有很多。   举个栗子: 假设待排序的数组arr={72, 11, 82, 32, 44, 13, 17, 95, 54, 28, 79, 56} 基数排序的两个关键要点: ...

    2022年5月11日
    1600
  • WEB开发中,使用JSON-RPC好,还是RESTful API好

    简单来说:不管哪个“好”还是不“好”,RESTful API在很多实际项目中并不实用。因此真的做了项目,你可能会发现只能用HTTP+JSON来定义接口,无法严格遵守REST风格。 为什么说不实际呢?因为这个风格太理想化了,比方说: REST要求要将接口以资源的形式呈现。但实际上,很多时候都不太可能将一些业务逻辑看作资源。即使强制这么干了,也会非常非常别扭。登...

    技术 2022年5月12日
    1600
  • 为什么说,MQ,是互联网架构的解耦神器?

    什么是耦合? 耦合,是架构中,本来不相干的代码、模块、服务、系统因为某些原因联系在一起,各自独立性差,影响则相互影响,变动则相互变动的一种架构状态。 感官上,怎么发现系统中的耦合? 作为技术人,每每在心中骂上下游,骂兄弟部门,“这个东西跟我有什么关系?为什么需要我来配合做这个事情?”。明明不应该联动,却要被动配合,就可能有潜在的耦合。   今天一起来看一个,...

    2022年5月7日
    5600
  • 第三方服务挂了,如何保证服务不受影响?

    上周有个朋友问我说: 沈老师,我们有很多服务依赖第三方接口,他们的接口不稳定,从而影响我们的服务,有没有什么方法避免? 今天和大家聊一聊这个问题。   首先,可以将第三方接口,收口到一个服务内。   这样,可以避免每个调用方都依赖于第三方服务: (1)解除调用方与第三方接口的耦合; (2)当第三方的接口变动时,只有服务需要修改,而不是所有调用方均修改;   ...

    2022年5月14日
    3300

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信