分布式SESSION一致性
时间:2022-07-24
本文章向大家介绍分布式SESSION一致性,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
分布式SESSION一致性
SESSION
是服务器为客户端创建的一个会话,存储用户的相关信息,用以标识用户身份等。在单服务器环境下是不需要考虑会话的一致性的问题的,但是在集群环境下就会出现一些问题,假如一个用户在登录请求时负载均衡到了A
服务器,A
服务器为其分配了SESSION
,下次请求数据时被分配到了B
服务器,此时由于B
服务器不存在此用户的SESSION
,此用户会被重定向到登录页面,这种情况是不合理的业务逻辑,所以需要维护SESSION
的一致性。
解决方案
SESSION 同步
多个服务器之间互相同步SESSION
,即A
服务器生成一个SESSION
信息后同步传输到B
、C
、D
等服务器,同样B
、C
、D
服务器生成SESSION
信息后也需要同步到A
,这样每个服务器之间都包含全部的SESSION
优点
- 大部分应用服务器都提供了
SESSION
复制的功能来实现集群
缺点
-
SESSION
需要网络传输进行同步,其会占用带宽,并且存在一定的延迟 - 一旦某台机器的
SESSION
信息有所变化,必须同步更新所有服务器SESSION
内容 - 每个服务器都会存储全部的用户信息,性能随着服务器增加急剧下降,而且容易引起广播风暴
SESSION 映射
通过将负载均衡服务器进行修改,通过对返回给用户的SESSION ID
或者用户请求的IP
地址进行标记,也就是使用第四层传输层中读取网络层的IP
或者是在第七层中读取HTTP
协议中某些属性来做HASH
,保证对于此用户的请求全部落到同一台服务器上
优点
- 实现相对简单
- 只要分配服务器时均匀,则多台服务器是负载均衡的
缺点
- 一旦某台服务器宕机,则会影响落在此服务器请求上的全部用户
- 负载均衡服务器变为了一个有状态的节点,内存消耗会更大,容灾更麻烦
客户端存储
将数据直接存储到客户端比如Cookie
或请求头中,每次请求客户端自动携带数据信息
优点
- 简单,高效
- 服务端不需要储存标记用户信息
缺点
- 安全性较差,对于敏感信息必须加密
- 每次请求可能携带大量数据,占用外网带宽
- 数据存储在客户端就会存在泄密、篡改、窃取等隐患
后端集中存储
将SESSION
存储在一台单独的服务器中的数据库中,例如Mysql
、Oracle
、SqlServer
、Redis
、Mongodb
等等,各SERVER
服务器需要用户信息时携带SESSION ID
对于集中存储服务器进行请求,进而获取用户信息
优点
- 没有安全隐患
- 可以方便的水平拓展
-
SERVER
服务器重启不会造成SESSION
丢失
缺点
- 每次请求都增加了一次对于存储服务器的网络请求
- 会对集中存储服务器存在大量请求,数据库压力比较大
参考
https://www.jianshu.com/p/5caed857dc3e
https://www.cnblogs.com/study-everyday/p/7853145.html
- WordPress REST API 定制化输出
- ASP.NET MVC的Action Filter
- Android LayoutInflater详解
- 在Android中实现service动态更新UI界面
- VUE 入门基础(5)
- Android的UI设计与后台线程交互
- 更强悍的Silverlight: WCF RIA Services
- Java究竟该怎么学?文末有彩蛋!
- python-IDLE清屏和标记行数,其他推荐
- 从0到1:PostCSS 插件开发最佳实践
- VUE 入门基础(4)
- 实例演示Android异步加载图片
- 使用OData协议查询Windows日志
- Android之Notification介绍
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- python-剑指offer1-5
- Java中的mutable和immutable对象
- python-剑指offer6-10
- 为什么DBA不让给MySQL数据库中加触发器呢?
- python-剑指offer11-15
- python-剑指offer16-20
- ArrayList源码学习
- Java程序员不缺对象,缺的是对象存储
- StringBuffer StringBulider String的区别
- 求X值问题
- python-剑指offer21-40
- Java8实战--引入流
- ThingJS数据对接方法介绍——Ajax
- python-剑指offer41-62
- 【python-opencv】读取、显示、写入图像