当前位置: 首页 > news >正文

session一致性架构设计

 

  什么是session?

  由于HTTP协议是无状态的协议,因此它不会去记住上一次浏览器访问服务器时的信息。同一个用户的两次操作,与两个不同用户的操作,对它来说是一样的。 这样虽然满足了互联网web应用的海量访问的需求,但是对于现今类似电商的应用来说,是需要实现登录以及身份验证需求的,但是无状态的HTTP显然是做不到的,这样才出现了session。

  Web服务器为每个用户创建一个会话,存储用户的相关信息,以便多次请求能够定位到同一个上下文。

  web-server可以自动为每一个浏览器访问的用户自动创建session,提供数据存储功能。最常见的,会把用户的登录信息、用户信息存储在session中,以保持持续登录状态。

 

  什么是session一致性问题?

  每次http短连接请求,理论上服务端都能定位到session,保持会话状态。

  当应用只有一台web-server提供服务时,每次浏览器发送http请求,都能够正确路由到存储session的对应web-server(因为只有一台)。

  此时的web-server是无法保证高可用的,因此如果我们采用Nginx反向代理,然后加上web-server “冗余+故障转移”的方案,用多台web-server来保证高可用时,每次http短连接请求就不一定能路由到正确的session了

  比如第一次用户登录的时候,Nginx路由到 web-server1,且在web-server1上创建了session,当第二次访问时,Nginx路由到了web-server2上。此时web-server2上是没有用户的登录信息的,那么就会导致用户需要重新登录,这样用户体验肯定是不好的。

  那么如何保证分布式系统的session路由一致性呢?

  一、session同步法

  这个方案的思路就是,多个web-server之间相互同步session,这样每个web-server之间都包含全部的session。

  优点:应用程序不需要修改代码。

  不足

  • session的同步需要数据传输,占内网带宽,有时延

  • 所有web-server都包含所有session数据,数据量受内存限制,无法水平扩展。

 

  二、客户端存储法

  这个方案的思路就是,服务端存储所有用户的session的话内存占用较大,可以将session存储到浏览器cookie中,每个端只要存储一个用户的数据了。

  优点:服务端不需要存储。

  缺点

  • 每次http请求都携带session,占外网带宽

  • 数据存储在端上,并在网络传输,存在泄漏、篡改、窃取等安全隐患

  • session存储的数据大小受cookie限制

   “端存储”的方案虽然不常用,但确实是一种思路。

 

  三、反向代理hash一致性

  这个方案的思路就是,在反向代理层做点文章,让同一个用户的请求保证落在一台web-server上。

  我们可以在反向代理层使用用户ip来做hash,以保证同一个ip的请求落在同一个web-server上。

  优点

  • 只需要改nginx配置,不需要修改应用代码

  • 负载均衡,只要hash属性是均匀的,多台web-server的负载是均衡的

  • 可以支持web-server水平扩展

  不足

  • 如果web-server重启,一部分session会丢失,例如部分用户重新登录

  • 如果web-server水平扩展,rehash后session重新分布,也会有一部分用户路由不到正确的session

 

  四、后端统一存储法

  思路就是,将session存储在web-server后端的存储层,数据库或者缓存

  优点

  • 没有安全隐患

  • 可以水平扩展,数据库/缓存水平切分即可

  • web-server重启或者扩容都不会有session丢失

  不足增加了一次网络调用,并且需要修改应用代码。

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

 

  总结

  保证session一致性的架构设计常见方法:

  • session同步法:多台web-server相互同步数据

  • 客户端存储法:一个用户只存储自己的数据在cookie中。

  • 反向代理hash一致性:保证一个用户的请求落在一台web-server上

  • 后端统一存储:web-server重启和扩容,session也不会丢失

 

  对于方案3和方案4,个人建议推荐后者:

  • web层、service层无状态是大规模分布式系统设计原则之一session属于状态,不宜放在web层。

转载于:https://www.cnblogs.com/xiexin2015/p/9061939.html

相关文章:

  • 《shell编程实战》第4章shell变量进阶(上)
  • 批量实现多台服务器之间ssh无密码登录的相互信任关系
  • 与Bob McWhirter的问答:WildFly Swarm更名为Thorntail项目
  • AsyncTask实现原理
  • 最简单的无缝轮播
  • c中perror函数
  • 小身材超能量Oracle新一代数据库机帮助所有规模企业迈向云端
  • Confluence 6 注册单一小工具
  • Redis分布式锁的try-with-resources实现
  • shell脚本案例(五)利用nmap批量扫描存活主机
  • Echarts关于仪表盘
  • mysql 查询当天、本周,本月,上一个月的数据---https://www.cnblogs.com/benefitworld/p/5832897.html...
  • php实现求数组中出现次数超过一半的数字(isset($arr[$val]))(取不同数看剩)(排序取中)...
  • linux---文件颜色含义
  • echarts学习笔记 各图配置(折线图、圆环图、柱形图、折线面积图)
  • Apache Zeppelin在Apache Trafodion上的可视化
  • extract-text-webpack-plugin用法
  • Java Agent 学习笔记
  • 大快搜索数据爬虫技术实例安装教学篇
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 力扣(LeetCode)22
  • 数组大概知多少
  • 微信开源mars源码分析1—上层samples分析
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • 一、python与pycharm的安装
  • python最赚钱的4个方向,你最心动的是哪个?
  • 函数计算新功能-----支持C#函数
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (三)模仿学习-Action数据的模仿
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (转)ORM
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .NET NPOI导出Excel详解
  • .net Stream篇(六)
  • .net web项目 调用webService
  • .NET 动态调用WebService + WSE + UsernameToken
  • .NET 依赖注入和配置系统
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .net打印*三角形
  • .NET多线程执行函数
  • .NET框架
  • .NET微信公众号开发-2.0创建自定义菜单
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • @Autowired多个相同类型bean装配问题
  • [ vulhub漏洞复现篇 ] ECShop 2.x / 3.x SQL注入/远程执行代码漏洞 xianzhi-2017-02-82239600
  • [ACM] hdu 1201 18岁生日
  • [Angular] 笔记 16:模板驱动表单 - 选择框与选项
  • [C# 开发技巧]如何使不符合要求的元素等于离它最近的一个元素
  • [C]整形提升(转载)
  • [flink总结]什么是flink背压 ,有什么危害? 如何解决flink背压?flink如何保证端到端一致性?