分布式session一致性解决方案

2024-09-04 05:48

本文主要是介绍分布式session一致性解决方案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

分布式Session一致性问题

在早期的时候,很多网站由于用户规模较小,都是采取的单机部署的模式,只用一台服务器来承载用户的请求,这时候Session是存在同一台服务器上,所以能够很容易实现会话跟踪和保持。然而随着用户规模的扩大,单机部署模式已经无法承载所有用户的请求了,这时候人们自然而然想到用多台服务器来处理用户的请求,用户的请求会先到达负载均衡,然后再被转发到某个具体应用服务器上进行处理。这时候我们就会遇到一个问题,每次处理同个用户的请求的服务可能不同,那怎么让它们的Session数据保持一致呢?

一般来说有以下四种方案:

  • Cookie存储Session

  • Session粘滞

  • Session复制

  • Session集中管理

我们来一个一个了解它们的优劣和使用场景

分布式Session一致性解决方案

Cookie存储Session

我们知道Cookie总只有一份的,而且是存在用户端的,所以我们可以通过Cookie来存储Session信息,这样不管最后发送到哪台服务器处理,我们都能通过Cookie取到Session信息。使用这个方案有以下优缺点

优点

  • 简单易用,无需额外的配置

  • 无需额外的外部存储

缺点

  • 为了数据不被泄露,一般需要进行加密,加解密过程需要一定开销

  • Cookie长度和数量有限制,会限制数据的存储

  • 每次请求都多出来了Session的数据,需要消耗更多网络带宽和系统性能

  • 受限于Cookie的开闭,如果用户关闭Cookie,Session就失效了,用户也就无法正常访问了

适用场景:数据量小的情况。

Session粘滞

也就是粘性Session,当用户访问负载均衡时,通过某种方法算出该用户应该访问的后端服务器,例如通过hash算法。这样保证了每个会话都在同一台服务器上。使用这个方案有以下优缺点:

优点

  • 使用简单,只需要配置好转发规则即可。

  • 没有额外网络开销

缺点

  • 存在单点问题,一但某台机器重启或宕机,相对应的Session数据将会丢失

  • 会话标识是应用层的信息,则负载均衡器要将同一个会话的请求都保存到同一个Web服务器上的话,就需要进行应用层(七层)的解析,这个开销比第四层的交换要大。或许有同学会说,nginx 四层转发可以支持ip hash的方式,这样就能通过四层转发了。事实上最好的方案是通过会话id进行hash,因为在日常生活中还是很容易出现ip发生变化的情况,例如从家里出去的时候,我们手机连接的网络从wifi切换到无线流量会发生ip变化,这时候通过ip hash的方式就会丢失Session了。

  • 负载均衡器变为了一个有状态的节点,需要计算会话和具体Web服务器的映射,因此内存消耗会更大

适用场景:机器数适中、对稳定性要求不是非常苛刻的情况

Session复制

既然只有一台机器存Session容易出现单点问题,那么我们就所有机器都存Session,每台机器间进行Session同步,这样不管访问到哪台机器都能获得Session。这就是Session复制方式,我们给服务器之间增加了会话数据的同步,通过同步来保证不同服务器之间的Session数据的一致。使用这个方案有以下优缺点:

优点

  • 实现简单,只需要少量配置

  • 即使某台机器宕机或者重启也不影响用户访问

缺点

  • 需要依赖支持Session同步的Web服务器,如果Web服务器不支持就不能使用了

  • 存在延迟,因为要等待Session同步过来,特别是在数据量比较大的情况下更加明显

  • 在服务器集群达到数千台的时候,就会出现瓶颈,因为每台机器都会对外广播自己的Session,同时要接收其他几千台机器发出的Session,非常损耗性能。

  • 数据冗余非常严重,几千台服务器就有几千份冗余数据,浪费了相当多的资源

适用场景:服务器比较少且Session数据量少

Session集中管理

通过单独的服务器集群来存储和管理Session数据,例如redis,其他所有的应用服务器都从这个存储集群获取对应的Session,从而实现Session的共享。

优点

  • 可靠性较高,通过单独的集群进行统一管理

  • 减少应用服务器的资源开销

缺点

  • 实现较为复杂,配置较多

  • 需维护单独的存储集群

适用场景:应用服务器较多、可用性要求较高

每个方案都各有其适用的场景,大家在实际使用过程中需要根据实际情况进行选择

参考资料

http://blog.itpub.net/69951287/viewspace-2664889/

Enjoy it !

如果觉得文章对你有用,可以赞助我喝杯咖啡~

版权声明

转载请注明作者和文章出处
作者: X先生
https://blog.csdn.net/u013314679/article/details/105637192

这篇关于分布式session一致性解决方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1135168

相关文章

Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案

《Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案》:本文主要介绍Vue3组件中getCurrentInstance()获取App实例,但是返回nu... 目录vue3组件中getCurrentInstajavascriptnce()获取App实例,但是返回n

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

Node.js 数据库 CRUD 项目示例详解(完美解决方案)

《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/

深入理解Apache Kafka(分布式流处理平台)

《深入理解ApacheKafka(分布式流处理平台)》ApacheKafka作为现代分布式系统中的核心中间件,为构建高吞吐量、低延迟的数据管道提供了强大支持,本文将深入探讨Kafka的核心概念、架构... 目录引言一、Apache Kafka概述1.1 什么是Kafka?1.2 Kafka的核心概念二、Ka

Vuex Actions多参数传递的解决方案

《VuexActions多参数传递的解决方案》在Vuex中,actions的设计默认只支持单个参数传递,这有时会限制我们的使用场景,下面我将详细介绍几种处理多参数传递的解决方案,从基础到高级,... 目录一、对象封装法(推荐)二、参数解构法三、柯里化函数法四、Payload 工厂函数五、TypeScript

jupyter代码块没有运行图标的解决方案

《jupyter代码块没有运行图标的解决方案》:本文主要介绍jupyter代码块没有运行图标的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录jupyter代码块没有运行图标的解决1.找到Jupyter notebook的系统配置文件2.这时候一般会搜索到

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

Linux samba共享慢的原因及解决方案

《Linuxsamba共享慢的原因及解决方案》:本文主要介绍Linuxsamba共享慢的原因及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux samba共享慢原因及解决问题表现原因解决办法总结Linandroidux samba共享慢原因及解决

找不到Anaconda prompt终端的原因分析及解决方案

《找不到Anacondaprompt终端的原因分析及解决方案》因为anaconda还没有初始化,在安装anaconda的过程中,有一行是否要添加anaconda到菜单目录中,由于没有勾选,导致没有菜... 目录问题原因问http://www.chinasem.cn题解决安装了 Anaconda 却找不到 An

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用