什么是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

session一致性架构设计相关推荐

  1. session一致性架构设计极简教程

    一,缘起 什么是session? 服务器为每个用户创建一个会话,存储用户的相关信息,以便多次请求能够定位到同一个上下文. Web开发中,web-server可以自动为同一个浏览器的访问用户自动创建se ...

  2. 无限容量数据库架构设计

    花了不少时间,把自己曾经做过的系统,曾经遇到到的问题,曾经实践过的架构方案,梳理总结和沉淀,尽量"系统的"记录成文字,和大家一起讨论. 本文是不同业务场景下,体系化的介绍" ...

  3. 架构设计 | 分布式体系下,服务分层监控策略

    本文源码:GitHub·点这里 || GitEE·点这里 一.分布式故障 分布式系统的架构,业务开发,这些在良好的思路和设计文档规范之下,是相对来说好处理的,这里的相对是指比较分布式架构下生产环境的突 ...

  4. recv发送失败 缓冲区太小_从 GFS 失败的架构设计来看一致性的重要性

    作者简介 陈东明,饿了么北京技术中心架构组负责人,负责饿了么的产品线架构设计以及饿了么基础架 构研发工作.曾任百度架构师,负责百度即时通讯产品的架构设计.具有丰富的大规模系统构 建和基础架构的研发经验 ...

  5. 网易用户认证架构设计 | session token | 公开课笔记-01

    网易严选中的用户认证架构设计 (一)Session本质及限制分析 1.背景 目前是Web2.0交互式网络时代 HTTP:传输HTML(一种超文本标记语言,侧重静态,不随请求变化而变化),所以HTTP天 ...

  6. 千万级流量的大型分布式系统架构设计

    本文是学习大型分布式网站架构的技术总结.对架构一个高性能.高可用.可伸缩及可扩展的分布式网站进行了概要性描述,并给出一个架构参考.文中一部分为读书笔记,一部分是个人经验总结,对大型分布式网站架构有较好 ...

  7. 照抄不翻车:抗住千万流量的大型分布式系统架构设计

    作者介绍 烂猪皮,十余年工作经验,曾在 Google 等外企工作过几年,精通 Java.分布式架构.微服务架构以及数据库,最近正在研究大数据以及区块链,希望能突破到更高的境界. 本文是学习大型分布式网 ...

  8. java架构设计和框架开发有什么区别

    前言 我的一个朋友,开发四年了,没跳过槽,四年时间也不过是从最开始的10K涨到了15K,经常和我吐槽工资低.去年8月份左右开始了他"骑驴找马"的行动,从各种地方找学习资料.刷面试题 ...

  9. ZooKeeper架构设计及其应用要点

    ZooKeeper架构设计及其应用要点 ZooKeeper是一个开源的分布式服务框架,它是Apache Hadoop项目的一个子项目,主要用来解决分布式应用场景中存在的一些问题,如:统一命名服务.状态 ...

最新文章

  1. Ubuntu命令终端查看使用过的命令
  2. Machine Learning Algorithm
  3. 【Android NDK 开发】JNI 动态注册 ( 动态注册流程 | JNI_OnLoad 方法 | JNINativeMethod 结构体 | GetEnv | RegisterNatives )
  4. git 合并多次commit
  5. Linux生成随机字符串
  6. itextpdf添加表格元素_java使用iText生成pdf表格详解
  7. python在win7中不能运行_Python3.6在win7中无法正常运行的问题
  8. 华为云备案服务全面升级,EI助力带来极速体验
  9. JavaScript 函数参数是传值(byVal)还是传址(byRef)?
  10. 奥维互动地图自建谷歌地图服务器,奥维互动地图添加谷歌地图完美
  11. html书签展示(带搜索)
  12. WPS Office 2021 Mac免费办公软件
  13. Day 21 第三关练习题-权限
  14. 互联网运营起步 |《从零开始做运营》读书笔记
  15. Flutter 路由原理解析
  16. 单元测试:桌面检查、走查方式、代码审查
  17. 【Bug解决】curl: (7) Failed connect to 192.168.159.133:8888; No route to host
  18. 腾讯云学生服务器购买指南
  19. MindMaster思维导图国内版更名“亿图脑图MindMaster”国产软件加速崛起!
  20. 关于无法连接到 DESKTOP-MQNPSU7\SQLEXPRESS

热门文章

  1. 机器字长、存储字长、指令字长
  2. Golang——秒懂函数、参数、可变参数、匿名函数、回调函数、内置函数
  3. java 配置jmstemplate_Spring JMSTemplate 与 JMS 原生API比较
  4. 柔性体没有应变_边坡防护终结篇!柔性防护系统(主被动网)知识总结!
  5. python找钱_python 递归 找零钱
  6. ebs oracle 落伍了吗_向不了解oracle EBS的人介绍Oracle EBS
  7. php对角线数组代码,php数组内容查找代码
  8. 这是一个成长差异化的时代
  9. 关于“数据分析”如何快速入门一些基本思路
  10. 拼多多黄峥一句话,阿里P8的我,越想越后怕