状态保持的解决方案:详解分布式session

用户状态保持机制-Session Session 是 Web 开发中常用的一种服务器端状态管理机制,它用于在服务器端存储用户的会话信息,以实现跨页面和跨请求的数据共享。 阅读详情

分布式session解决了什么问题?

随着容器化、云原生等的流行,DevOps团队也在不断鼓吹「以无状态为荣,以有状态为耻」。因为有状态的服务难以部署、难以扩展。

「状态」其实对用户体验而言是个好东西。保存用户的登录状态;浏览器异常关闭再次打开恢复用户之前的窗口状态;记录用户的偏好状态……于是勤于动脑的软件工程师们就想了:怎么既能拥有无状态化的扩展性,又拥有有状态时的良好用户体验呢?

答案就是分布式session。它更像是一种业务问题的解决方案

常用的分布式session解决方案

2007年至今-客户端存储

使用cookie

客户端存储是指直接将信息存储在cookie中。客户端通过http协议和服务器进行cookie交互,通常用来存储一些不敏感信息。它有很明显的缺点:

  • 数据存储在客户端,存在安全隐患

  • cookie存储大小、类型存在限制

  • 数据存储在cookie中,如果一次请求cookie过大,会给网络增加更大的开销

虽然这种方式有缺点,但是可以通过合理的控制减少副作用。所以我从07年参加工作时就在用这种方法,现在的系统也还在用。JWT就是其中一个典型,它长度小,信息做了加密,一般仍然是存储在cookie中解决单点登录问题。

JWT

JWT:Json Web Token,是基于Json的一个公开规范,这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息,他的两大使用场景是:认证和数据交换。

由服务端根据规范生成一个令牌(token),并且发放给客户端。此时客户端请求服务端的时候就可以携带者令牌,以令牌来证明自己的身份信息。

2009年开始我进行互联网领域,有几年和JWT打交道比较多。因为那时候,你想不想做全栈都是全栈,因为前后端不分离,做什么都是一坨。也就是近7年更专注做后端了。那时候记忆比较深的就是cookie里存着一段用很简易的加密做的字符串,用户名信息等关键信息之间用一个下划线隔开,还有一个带有效期的随机数字段,数据库里也存一份。匹配上了就认证成功用户登录状态session有效。

没听说谁家用过-session会话保持(黏滞会话)

会话保持是利用负载均衡的原地址Hash算法实现,负载均衡服务器总是将来源于同一IP的请求分发到同一台服务器上,,也可以根据cookie信息将同一个用户的请求每次都分发到同一台服务器上,不过这时的负载均衡服务器必须工作在HTTP协议层上。这种会话保持也叫黏滞会话(Sticky Sessions)。

这种方案虽然保证了每个用户都能准确的拿到自己的session,而且大量用户访问也不怕,但是这种会话保持不符合系统高可用的需求。这种方案有着致命的缺陷:一旦某台服务器发生宕机,则该服务器上的所有session信息就会不存在,用户请求就会切换到其他服务器,而其他服务器因为没有其对应的session信息导致无法完成相关业务。所以这种方法基本上不会被采纳。

2010年-服务器session复制

原理:任何一个服务器上的session发生改变(增删改),该节点会把这个 session的所有内容序列化,然后广播给所有其它节点,以此来保证Session同步。

优点:可容错,各个服务器间session能够实时响应。

缺点:会对网络负荷造成一定压力,如果session量大的话可能会造成网络堵塞,拖慢服务器性能。

我在10年的时候,在公司举行了一个讲座上听人家说过,自己没用过。对这个印象也不深:因为当初那个讲座是leader非要我去的,我坐在第一排,然后……睡着了。因为确实也比较无聊,互联网场景下很少有场景需要这样用。

2011年至今-状态集中存储

2011年,我经过两年的努力,终于在公司里,从一个写业务代码的开发,转成了一个中间件开发者。当时让我一个负责约等于是开发一个zookeeper吧。那时候zookeeper还没有普及,当时很多公司都在开发自己的中间件。

一个下午,我在测试环境发布了一个不成熟的版本,自己的服务挂了。一屋子的人都站了起来。因为我这边挂了,其他人的模块都跑不起来。好像有点跑题了,总之,从那之后,市面上开始出现了各种集中式的状态存储:zookeeper、memcache缓存,其实数据库也是一种。

本质上,对于Java开发者来说,session存储的东西只是从JVM内移到了JVM外。而这种场景下会话保持就相当于是按照hash值进行路由,session复制就相当于集中存储的副本了。也就是说session会话保持和服务器session复制实际上是现代状态集中存储的基础原理,只不过是管理方由业务开发人员转移到中间件管理端,降低了对业务开发人员的开发管理成本。

session使用注意事项

15年时,我们线上发生过一个问题:我正在验证一个线上功能。为了更好的验证,用chrome浏览器登录一个用户,用IE登录另外一个用户。这时候,我刷新了IE页面,结果IE用户突然自己变成了chrome的用户。以多年做技术的敏锐嗅觉,我意识到在组件层面出了问题。于是将这个问题立即上报了技术经理。技术经理听了我的报告,联系了负责CDN的团队。经过他们的排查,CDN的静态缓存策略设置的有问题,他们立即更新了策略解决了问题。(现在想来一身冷汗啊,随随便便就操作生产了?)

【python】cookie和session实现状态保持(django中) 一、什么是状态保持?! 所谓的状态保持就是,服务端存储用户身份信息; 所谓的身份认证就是,服务端依据状态保持信息,认证出用户身份; 二、实现状态保持的方案 Cookie和Session的相同点:(1)、状态保持;(2)、缓存数据 1、使用Cookie实现状态保持 2、使用Session机制实现状态保持 业务:需要做保持登录状态/状态保持功能. 保持登录状态可以使用 cookie 或 session 来实现 但是 cookie 不安全, 所以我们使用 session 保存. django 中有提供 阅读详情

相关推荐

SpringSecurity中的集群会话Session存在的问题以及解决方案(保持、复制、共享)

在初步了解Session的时候,我们就知道Session通常是保存在服务器的内存当中的。每一次客户访问都会携带SessionId,然后在服务器的内存中寻找。虽然这种方式简单快捷,但是仍存在比较明显的缺点。服务器的内存是有限的,所以留给Session的空间不多,因此一旦用户的访问量比较多时内存就会捉襟见肘。而且因为session是存在内存当中,并不是持久化存储,就算服务器性能特别好,但是也不免存在服务器的异常停止和重启,这个时候就会导致会话状态的丢失。

SunRains 4112

java实现用户登录_SpringBoot 实现用户登录,分布式Session功能

之前介绍过不少关于登录功能的代码,本文介绍一下关于分布式Session 的功能实现,完整代码(以后写博客,尽量给 git 地址)在https://github.com/saysky/sensboot通常,我们的项目都是多实例部署的,生产环境通常一个模块可能都会部署四五台服务器。我们知道用户登录后,需要存储session信息,session 信息通常是存储在服务器的内存中的,不能持久...

weixin_39661881的博客 1465

38.状态保持之Session详解

38.状态保持之Session详解

孤寒者的博客 2万+

几种保持登录状态的方式

三种保持会话的方式 href:https://blog.youkuaiyun.com/bad_lee/article/details/82529528 (三)token机制保持会话 使用方法 cookie 和session依赖于浏览器,如果客户端不是浏览器,那么需要手动添加token(和cookie类似,也是登录凭证),将token添加到http header或者做为参数添加到url。 存在的问题 每次访问的...

个人纪录、总结! 1967

Web应用状态管理:掌握使用session保持登录状态

在Web应用中,Session是一种服务器端的机制,用于跟踪用户与服务器之间的交互,从而保持用户状态。当用户首次访问服务器时,服务器会创建一个新的Session,分配一个唯一的标识符(Session ID),并将其存储在服务器端,同时将Session ID发送到客户端保存。

weixin_31620365的博客 1041

Java 使用HttpClient保持SESSION状态

NULL 博文链接:https://piranha.iteye.com/blog/2119924

微服务的会话保持

单点登录实现思想 微服务项目因为有多个服务器组成,遇到了会话保持问题 在一个服务器上登录,能够让所有服务器知道当前用户的信息的解决方案就是单点登录 单点登录的办法有很多,但是实现思路主要有两种 1.Session共享 2.Token令牌 方法一:session共享 原理:让用户的登录信息共享给所有模块,用户登录时共享session 上图采用session实现单点登录: 基本思路是将用户信息保存到Redis,哪个模块需要用户信息,从redis中取 优点:安全性高 ...

thm0805的博客 661

自动驾驶传感器选型实战:摄像头、激光雷达与毫米波雷达融合策略

自动驾驶感知系统的核心在于多传感器协同,而非单一技术优劣。摄像头擅长语义识别但受光照和天气制约;激光雷达提供高精度测距却面临成本、温漂与多径干扰等物理瓶颈;毫米波雷达则以全天候鲁棒性与精准测速成为安全底线的守门人。三者融合不是简单叠加,而是基于场景约束(如暴雨、强光、高速跟车)、成本边界(BOM控制)与时间窗口(量产节奏)的工程权衡。真实量产方案中,‘纯视觉’实为视觉主责+毫米波兜底,‘激光雷达上车’本质是用硬件真值加速算法迭代,而传统车企更倾向以毫米波为仲裁者协调冲突。理解这些底层原理,才能在传感器选型、

weixin_32495691的博客 277

分布式系统下会话保持方案

缺点:在同一局域网下的用户ip地址可能是同一个,那么找到对应的后端服务器会相同,会造成流量偏移,且如果这台服务宕机了,那么对应的session信息也会同步消失。缺点:加入redis和springSession相当于额外引入了系统,对于引入的系统也会提升运维和开发的成本,如果后端服务器过多回造成redis的不堪重负。ip hash:是通过客户端传过来的ip地址,找到对应的hash值,再跟据hash值找到对应的服务器,去获取session的请求.优点:响应速度快,因为是通过hash直连后端服务器。......

AC_XI的博客 1238

BGE-Reranker-v2-M3介绍

重排序模型介绍

吉米_王 5898

单细胞专题(1) | 单细胞转录组研究样本准备指南(上)

单细胞RNA测序(scRNA-seq)是目前最前沿,能进行大规模实验的转录组研究技术,为理解细胞组成和动态生物学过程提供了很多新的见解。单细胞研究已经为我们理解发育过程,老化和疾病(如癌症)等提供了大量数据。在这里,小编主要就前期的样本准备与保存需注意问题给大家进行讲解,以备大家在不同的研究场景和研究背景下,走好单细胞转录组学研究的第一步。

bioyigene的博客 4232

requests.session()会话保持

可能大家对session已经比较熟悉了,也大概了解了session的机制和原理,但是我们在做爬虫时如何会运用到session呢,就是接下来要讲到的会话保持。 首先说一下,为什么要进行会话保持的操作? requests库的session会话对象可以跨请求保持某些参数,说白了,就是比如你使用session成功的登录了某个网站,则在再次使用该session对象求求该网站的其他网页都会默认使用该ses...

学习python 8万+

IBM AC922 8335-GTW 安装linux,CentOS,ubuntu,RHEL各种坑

AC922

u011970286的专栏 902

状态保持解决方案-分布式session的历史血脉

上篇文章《网络通信之Session的历史血脉》是围绕着理解底层通信来的。因为不管是MQ还是持久层框架中,建立连接后都使用了session来保持或者保存状态数据。上篇文章和《深入理解MQ生产...

xiexiaojing的博客 365

LVGL v9的lv_scale控件实战:5分钟打造动态仪表盘(附完整代码)

本文详细介绍了LVGL v9中lv_scale控件的实战应用,通过5个关键步骤快速打造动态仪表盘。文章涵盖核心特性解析、代码实现、样式定制及性能优化,适用于工业HMI、智能家居等场景,并附完整代码示例。

gin88的博客 262

基于FPGA的7x7矩阵求逆verilog开发

up目录一、理论基础二、核心程序三、测试结果 矩阵求逆,即求矩阵的逆矩阵。矩阵是线性代数的主要内容,很多实际问题用矩阵的思想去解既简单又快捷。逆矩阵又是矩阵理论的很重要的内容,逆矩阵的求法自然也就成为线性代数研究的主要内容之一。设A是数域上的一个n阶方阵,若在相同数域上存在另一个n阶矩B,使得: AB=BA=E。 则我们称B是A的逆矩阵,而A则被称为可逆矩阵。其中,E为单位矩阵。典型的矩阵求逆方法有:利用定义求逆矩阵、初等变换法、伴随阵法、恒等变形法等。 逆矩阵的求法有多种,其中重要

FPGA/MATLAB学习教程/源码/项目合作开发 3898

深入理解 Cookie 与 Session —— Web 状态保持详解与实战

原理:攻击者在客户端或通过响应头写入相同名称的 Cookie,从而覆盖原有 Cookie 内容,导致身份被冒用或数据被篡改。场景同一域名下的不同子域篡改 Cookie。恶意响应头设置同名 Cookie 覆盖原值。防护措施为 Cookie 设置明确的Domain和Path限制作用范围。对 Cookie 值进行签名和验证,防止篡改。原理:攻击者提前获取或制造一个合法的 Session ID,然后诱导受害者使用该 Session ID。

2302_79797878的博客 1222

Qt之QMqtt 发送图片数据

MQTT是一个基于客户端-服务器的消息发布/订阅传输协议;MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛;在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT);其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用;

Ilson_的博客 1437

【Linux网络】深入理解 HTTP 协议(五):Cookie 与 Session从无状态到会话保持的底层实现

相信大家都有过这样的体验:登录 B 站后关闭浏览器,第二天打开依然保持登录状态;在购物网站添加商品到购物车,刷新页面后商品不会消失。但我们都知道HTTP 协议本身是无状态、无连接的,服务器根本 “记不住” 之前和哪个客户端打过交道。那么网站是如何识别我们身份的?这背后的核心技术就是Cookie 与 Session。本文将从 HTTP 无状态的本质出发,一步步拆解 Cookie 的工作原理、安全缺陷,再到 Session 的解决方案,并结合 C++ 源码带你从零实现一个基础的会话管理系统,彻底搞懂 Web 会

会当凌绝顶,一览众山小 3881

【Unity 实用工具篇】 | Unity网格破碎插件 unity-fracture

前面写过一篇Unity中物体破碎效果的插件:【Unity 实用工具篇】 | Unity物体破碎效果 OpenFracture 本文介绍一个另外的工具unity-fracture,也可以实现网格破碎效果,且功能与OpenFracture略有差异。

努力前行,总会成为自己心中的那道光 1万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Python Flask详解状态保持、Cookie、Session

状态保持因为 http 是一种无状态协议,浏览器请求服务器是无状态的。无状态:指一次用户请求时,浏览器、服务器无法知道之前这个用户做过什么,每次请求都是一次新的请求。无状态原因:浏览器与服务器是使用 socket 套接字进行通信的,服务器将请求结果返回给浏览器之后...

weixin_42008209的博客 2795

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

python利用session保持登录状态

在接口测试的过程中,经常会遇到有些接口需要在登录的状态下才能运行,否则会进行相应的提示,例如“请登录”: 我们有2种解决办法: 1、每次接口请求后获取到响应中的cookie,然后下次请求带上这个cookie,参考http_request2.py 2、使用requests的session会话对象 也就是requests的session会话对象来进行处理。会话对象让你能够跨...

weixin_33749131的博客 1万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

实现登录状态保持的方法:cookie session token jwt

实现登录状态保持的方法 方法一:cookie和session配合使用 首先,用户登录输入用户名和密码,浏览器发送post请求,服务器后台获取用户信息,查询数据库验证用户信息是否正确。如果验证通过,就会创建session来存储相关信息,并且生成一个cookie字符串,把sessionID放在cookie里面。然后返回给浏览器。 当用户下一次发起请求时,浏览器会自动携带cookie去请求服务器,服务器...

路漫漫其修远兮,吾将上下而求索。 4451

分布式session解决方案

sessionId: 一个sessionId可以唯一标识一个用户,这样就可以简单地进行用户识别。sessionId可以保存到客户端,但session只能保存到服务器中。session共享(分布式session)将session存储到redis等分布式缓存数据库中,而不是应用服务器如tomcat内部中。这样就可以保证session的一致性。参考: 1.http://blog.youkuaiyun.com/agf

sinat_34814635的博客 2627

Python爬虫之Requests模块session进行登录状态保持

利用requests.session进行状态保持 requests模块中的Session类能够自动处理发送请求获取响应过程中产生的cookie,进而达到状态保持的目的。接下来我们就来学习它 requests.session的作用以及应用场景 requests.session的作用 自动处理cookie,即 下一次请求会带上前一次的cookie requests.session的应用场景 自动处理连续的多次请求过程中产生的cookie requests.sessi

派拉斯兔子的博客 1万+
上一篇: 为什么 DNS 根服务器只有 13 台?给中国一台真的很难吗?
下一篇: SpringBoot + Mybatis-puls + ClickHouse(分页查询、添加、修改、删除)
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值