🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
1、什么是session,什么是session一致性 什么是session? 服务器会为每个用户创建一个会话,存储用户的相关信息,以便多次请求,能够定位到同一个上下文中,在web开发中,web-server可用自动的为同一个浏览器的访问用户,自动创建session,提供数据存储功能,最常见的会把用户的登录信息,用户信息存储在session中,以保持登录状态。 什么session一致性问题? 只要用户不重启浏览器,每次http短连接请求,理论上服务端都能定位到session,都能够定位到同一台web-server,以保持会话,这就是所谓的session一致性问题 2、解决session一致性问题,有哪些方案? 方案1: session同步法 思路: 站点集群session同步 ![](https://img.kancloud.cn/22/4e/224e709eb5d40840a7f023952cdcf267_561x377.png) 多个web-server之间相互同步session,这样每个web-server之间都包含全部的session 优点: web-server的功能,应用程序不需要修改任何代码 缺点: session同步需要数据传输,需要占大量的带宽,每台web-server需要维护的session会很多,数据量受内存限制,没办法进行水平扩展,当有多台web-server,性能下降 方案2: 客户端存储法 思路: session存储在客户端 缺点: 每次http请求都需要携带session,非常占用外网的带宽,数据存储在端上,并在网络上进行传输,存在泄密、篡改、窃取等安全隐患,存储量的大小会受到端上cookie的限制 方案3: 反向代理hash一致性(四层、七层) 思路: 反向代理路由保障 ![](https://img.kancloud.cn/ae/3b/ae3bd1a6040712d9f6db7f9bf30f4570_1333x409.png) 四层: ip hash 七层: 根据某些head属性,比如session_ip或用户id做hash 优点: 只需要修改nginx的配置,不需要修改业务代码,可用水平扩展 缺点: 如果web-server重启,有部分用户会受影响,需要重新登录,如果webserver水平扩展,那么nginx会重新hash,session会重新分布,也会导致一部分用户路由不到正确的session 方案4: 后端统一存储法 思路: 不存储在站点,统一存储在后端(数据库、缓存) 将session存储在web-server后端的存储层,数据库或者缓存,如图 ![](https://img.kancloud.cn/4c/a8/4ca866ad389069f98675fd469e8ec9b5_1000x466.png) 优点: 没有安全隐患,session不用在外网上进行传输,可用实现web层的任意水平扩展 缺点: 增加了一次网络调用,需要修改应用程序的代码,需要应用代码管理session 建议使用高可用的缓存(比如redis) 总结: 推荐使用方案4,使用缓存统一存储session