分布式系统session一致性问题

news/2025/2/23 21:59:00

一、引言

1.什么是session

Session 是服务器用来保存用户操作的一系列会话信息,由Web容器进行管理。最常见的,会把用户的登录信息、用户信息存储在 session 中,以保持登录状态。

2.session的创建

在会话开始时,分配一个唯一的会话标识 SessionID(sessionid 是一个会话的key,浏览器第一次访问服务器会在服务器端生成一个 session,

有一个 sessionId 和它对应。),并通过 Cookie 将这个标识告诉浏览器(客户端会将 sessionID 保存在 cookie 中。),

以后每次请求的时候,浏览器都会带上这个会话标识SessionID来告诉Web服务器这个请求是属于哪个会话的。

在Web服务器上,各个会话都有独立的存储,保存不同会话的信息。如果遇到禁用Cookie的情况,

一般的做法就是把这个会话标识放到URL的参数中。

3.session共享

分布式情况下,如果每台服务器都session存在自己的内存中,不同服务器之间就会造成数据不一致问题,

这时候就需要session共享。单机情况下,不存在Session共享的情况。分布式情况下,

如果不进行Session共享会出现数据不一致,比如:会导致请求落到不同服务器要重复登录的情况。

二、解决方案

1.session复制

 应用服务器开启web容器的session复制功能,在集群中的几台服务器之间同步session对象,

多个web-server之间相互同步session,这样每个web-server之间都包含全部的session。

不足:

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

  • 有更多web-server时,容易造成网络风暴

2. 客户端存储

将session存储到浏览器cookie中。每次请求服务器的时候,将session放在请求中发送给服务器,服务器处理完请求后再将修改后的session响应给客户端。

缺点:

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

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

3. 反向代理hash一致性

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

不足:

  • 如果web-server重启,一部分session会丢失,产生业务影响,例如部分用户重新登录

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

4. 后端统一集中存储

将session存储在web-server后端的存储层,数据库或者缓存,一般用redis/memchache缓存。

 

转载于:https://www.cnblogs.com/yumingxing/p/9505512.html


http://www.niftyadmin.cn/n/4557368.html

相关文章

c.k的师傅叫什么

是个双性恋 跟男生是谈精神上的恋爱 和女性的有肉体上的交缠(她日记里写的)她很爱她的爸爸妈妈 不想被遗忘 不想被伤害 有玩血和自残的习惯 经常用刀子把自己划的遍体鳞伤 用很多针管抽自己的血 每天都会一个人哭泣 她精神上特别痛苦 曾经一次性打过五个洞(耳洞之前已经有很多了…

谢谢了... 友友 一些C语言的题有时间能帮我做做吗

他们期负你了 最近生活怎么样 这里有的没换行 ||| 哈哈 &a); for(ia;i>1;i--) { si; } printf("s%d/n" s0; scanf("%d" a i); }}6题--在做&#xff08;我就是用vc6.0做的&#xff09; 答案补充 void main() { int i bai; for(i100;i<1000;i) { g…

vue路由--动态路由

前面介绍的路由都是路径和组件一对一映射的 有时候需要多个路径映射到一个组件&#xff0c;这个组件根据参数的不同动态改变&#xff0c;这时候需要用到动态路由 动态路由这样定义路由路径&#xff1a; path: /foo/:id--可以不叫id&#xff0c;任意命名 以下两种路径都会映射到…

23134

1234123asdfasdfds

谢谢了 大家好.能帮我做一下C语言这些题吗

||| 8个程序就20分.你的奖金太低了.还是算了. ||| 我可以帮你写 但你分太低 给高的话 可以帮你 联系我QQ 373840 ||| 算你运气好 n; for(n100;n<999;n) {in/100; j(n-i*100)/10; kn-i*100-j*10; mijk; if(m%70) aa1; } printf("%d" m k j i b);}(3)#include<st…

2021-05-24 第一周

目录计划学习内容grep命令基本用法grep中的正则表达式定位相关字符匹配相关匹配次数相关扩展模式总结Vim命令基本概念移动光标相关命令查找相关命令替换相关命令删除&#xff0c;复制&#xff0c;粘贴等操作进入和退出输入模式总结top命令指标说明编辑显示界面命令使用交互命令…

+-*/的表示

用C%就行..运算符还不是一个字符.. ||| C 中 就是 - * / 啊 % 还是 % (求余) ||| C 中 加 就是 这些都是算术运算符 减 就是 - 乘 就是 * 处 就是 / 取模 %&#xff08;也就是求余&#xff09; 例如 5%32 我除三 于2 呵呵

C语言高手来帮帮我啊.大家加油

如硬盘大小 大写的是表示容量大小的 速度的单位中的b是小写的 D 1 3 4 ||| 应该是D