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层。
session一致性架构设计的更多相关文章
- session一致性架构设计实践.
一.缘起 什么是session? 服务器为每个用户创建一个会话,存储用户的相关信息,以便多次请求能够定位到同一个上下文. Web开发中,web-server可以自动为同一个浏览器的访问用户自动创建se ...
- 分布式下Session一致性架构举例
一.问题及方案 见这篇文章:分布式下Session一致性问题 二.分布式环境搭建: 系统环境 [root@centos7 ~]# cat /etc/redhat-release CentOS Linu ...
- 分布式下Session一致性问题
一.Session一致性问题 1.1 什么是Session 用户使用网站的服务,基本上需要浏览器和web服务器进行多次交互,web服务器如何知道哪些请求是来自哪个会话的? 具体方式为:在会话开始时,分 ...
- MySQL性能调优与架构设计-架构篇
架构篇(1) 读书笔记 1.Scale(扩展):从数据库来看,就是让数据库能够提供更强的服务能力 ScaleOut: 是通过增加处理节点的方式来提高整体处理能力 ScaleUp: 是通过增加当前处理节 ...
- MySQL性能调优与架构设计
1.Scale(扩展):从数据库来看,就是让数据库能够提供更强的服务能力 ScaleOut: 是通过增加处理节点的方式来提高整体处理能力 ScaleUp: 是通过增加当前处理节点的处理能力来提高整体的 ...
- MySQL 性能管理及架构设计指南
一.什么影响了数据库查询速度 1.1 影响数据库查询速度的四个因素 1.2 风险分析 QPS:Queries Per Second意思是“每秒查询率”,是一台服务器每秒能够相应的查询次数,是对一个特定 ...
- 分布式系统session一致性的问题
session的概念 什么是session? 服务器为每个用户创建一个会话,存储用户的相关信息,以便多次请求能够定位到同一个上下文.这样,当用户在应用程序的 Web 页之间跳转时,存储在 Sessio ...
- 聊聊Zookeeper应用场景、架构设计、选主机制
Zookeeper作为一个分布式协调系统提供了一项基本服务:分布式锁服务,分布式锁是分布式协调技术实现的核心内容.像配置管理.任务分发.组服务.分布式消息队列.分布式通知/协调等,这些应用实际上都是基 ...
- MySql(十七):MySql架构设计——高可用设计之思路及方案
前言: 数据库系统是一个应用系统的核心部分,要想系统整体可用性得到保证,数据库系统就不能出现任何问题.对于一个企业级的系统来说,数据库系统的可用性尤为重要.数据库系统一旦出现问题无法提供服务,所有系统 ...
随机推荐
- 20155326刘美岑 《网络对抗》Exp1 PC平台逆向破解
20155326刘美岑 <网络对抗>逆向及Bof基础实践 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函 ...
- 7.AOP编程
注解和xml混合使用 1.将所有的bean都配置xml中 <bean id="" class=""> 2.将所有的依赖都使用注解 @Autowire ...
- Mac键盘按键符号
通过修饰键来查看 像command.option.control.shift这些按键在Mac下叫做修饰键,一般情况下他们大都用来辅助输入或者用作快捷键的修饰键. 打开“系统偏好设置”,点击“键盘→键盘 ...
- TextView展示富文本时emoj或图片和文字不对齐的解决方案
在项目中,回复框.聊天界面的显示往往会有emoj或者图片,但是一个比较头疼的问题是,会出现emoj表情或者图片和文字的位置不对齐,总是有偏移,这样很影响用户体验的.下面会总结一下如何解决这个问题. 本 ...
- SpringCloud-Eurake坑
首先遇到的问题 Eurake单台部署,很容易出现自我保护,发现web管理页面一大串红字警告 这个问题通过关闭自我保护机制可以简单解决..一般集群部署不会出现 eureka: server: renew ...
- 使用node.js如何爬取网站数据
数据库又不会弄,只能扒扒别人的数据了. 搭建环境: (1).创建一个文件夹,进入并初始化一个package.json文件. npm init -y (2).安装相关依赖: npm install ...
- Devops流程规范
芯盾时代_Devops_Docker操作说明及使用规范 北京芯盾时代科技有限公司 2019年1月 修订记录 版本号 修订人 修订日期 修订描述 v0.1 芯盾 2019/1/15 初次创建 v0.2 ...
- Linux学习笔记之四————Linux常用命令之文件管理
Linux命令——文件管理相关命令 <1>查看文件信息:ls ls是英文单词list的简写,其功能为列出目录的内容,是用户最常用的命令之一,它类似于DOS下的dir命令. Linux文件或 ...
- PostgreSQL Json字段作为查询条件案例
业务扩展字段在数据库中经常会使用json格式的数据来存储,这就涉及到一个头疼的问题,假设要使用扩展字段里的某个值作为查询条件怎么办,原来PostgreSQL本身就支持这种查询方式. 例子:假设业务扩展 ...
- 这是一位拿到BAT大厂offer应届生的年终总结,那么你的呢?
壹 关于求职 2018年初,我还在北京后厂村的马路上被风吹得瑟瑟发抖. 那时我刚刚结束了半年的实习时光,开始考虑年后是否要继续实习.一开始我也在纠结实习转正和秋招之间如何权衡,但是在经历了春招以后,我 ...