一文读懂分布式Session常见解决方案

前言

沉思君在之前的文章《谈谈HTTP状态保持》里介绍了有关HTTP状态保持的知识点,我们知道HTTP协议本身是无状态的,因此在使用HTTP协议进行通信的过程中,需要借助Session机制进行状态的保持。然而在大型网站中,我们的服务器数量通常不止一台,可能是几十台甚至几百台之多,用户发起的HTTP请求通常要经过像Ngnix之类的负载均衡器之后,再路由到具体的服务器上,由于Session默认是存储在单机服务器内存中的,因此在分布式环境下同一个用户发送的多次HTTP请求可能会先后落到不同的服务器上,导致后面发起的HTTP请求无法拿到之前的HTTP请求存储在服务器中的Session数据,从而使得Session机制在分布式环境下失效。

因此在分布式环境下,要使用Session机制进行状态保持,需要采取额外的手段,在这里介绍常见的4种解决方案:Session集中式存储、Session复制、Session Sticky、Cookie Based。

Session集中式存储

Session集中式存储是指将原先存储在单机服务器内存中的Session数据集中存储起来,比如说存储在分布式缓存Redis集群中。其原理是以SessionId作为Key,序列化后的HttpSession对象作为Value存储在Redis中,然后将SessionId返回给客户端,当下一次客户端发送HTTP请求到服务器的时候,会带上这个SessionId,服务器再根据SessionId从Redis拿到相应的Session数据并反序列化成HttpSession对象。由于对HttpSession对象进行了集中存储,而不是存储在服务器本地内存,所以即使同个用户的多次HTTP请求落到不同的服务器上,也能将SessionId与相应的HttpSession对象关联起来,从而实现分布式环境下的Session共享。那么问题来了,这种解决方案有什么优缺点呢?欢迎在评论区留下你的答案。

Session复制

Session复制从另一个角度解决分布式Session问题。前文说到,Session机制在分布式环境下失效的原因是每台服务器上只存储了部分客户端的Session信息,那么我们只要保证每台服务器上都存储了所有客户端的Session信息不就解决问题了吗?Session复制就是基于这个思路实现的,当客户端在某台服务器上存储了Session数据的时候,我们可以手动地将该Session信息同步到集群中的其他服务器上面去,这样一来所有服务器就都存储了所有客户端的Session信息了,因此即使同个客户端的多次HTTP请求落到不同的服务器上面去,也还是能够拿到相应的Session信息,故而也解决了Session分布式问题。实际上,一些开源的Web容器可以支持Session复制,如:Tomcat,因此实施起来难度不大。同样地,这种解决方案也是有利弊的,可以在评论区留下你的答案。

Session Sticky

从另一个角度来说,分布式环境下Session失效也可以说是因为同个客户端在多次请求之间落到不同的服务器上导致的。因此,如果能够保证同个客户端发起的HTTP请求都由相同的服务器进行处理,那么也可以避免Session失效的问题。比如说,Nginx有一种称为IP Hash的负载均衡策略,其可以实现相同IP发送的HTTP请求都路由到同一台服务器上面去,故而也能解决Session分布式问题。同样地,在评论区讨论这种方案的利弊吧。

Cookie Based

前面所讲的方案都是将Session数据存储在服务器中,其实要实现会话保持,还可以将Session数据存储在客户端,常见的方案是存储在Cookie中,这样一来服务器就无需维护客户端的状态,即服务器“无状态化”,无状态化的好处是利于服务器水平扩展。比如:JWT就是基于Cookie实现用户认证功能的,有兴趣的朋友可以去了解下。那么这种方案有何优缺点呢?评论区见。

总结

关于Session分布式处理的解决方案,沉思君之前也踩过很多坑,直到看了图灵学院的免费教学视频才豁然开朗。

原文发布于微信公众号 - 编程沉思录(code-thinker)

原文发表时间:2018-04-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏星汉技术

Kafka的存储机制以及可靠性

34911
来自专栏linux驱动个人学习

Linux下0号进程的前世(init_task进程)今生(idle进程)----Linux进程的管理与调度(五)【转】

Linux下有3个特殊的进程,idle进程(PID = 0), init进程(PID = 1)和kthreadd(PID = 2)

662
来自专栏Golang语言社区

TCP、UDP、IP 协议分析

互连网早期的时候,主机间的互连使用的是NCP协议。这种协议本身有很多缺陷,如:不能互连不同的主机,不能互连不同的操作系统,没有纠错功能。为了改善这种缺点,大牛弄...

2923
来自专栏码洞

深入理解 RPC 交互流程

文节我们讲解 RPC 的消息交互流程,目的是搞清楚一个简单的 RPC 方法调用背后究竟发生了怎样复杂曲折的故事,以看透 RPC 的本质。

452
来自专栏Java架构沉思录

一文读懂分布式Session常见解决方案

沉思君在之前的文章《谈谈HTTP状态保持》里介绍了有关HTTP状态保持的知识点,我们知道HTTP协议本身是无状态的,因此在使用HTTP协议进行通信的过程中,需要...

522
来自专栏熊二哥

Java并发编程快速学习

上周的面试中,被问及了几个关于Java并发编程的问题,自己回答的都不是很系统和全面,可以说是“头皮发麻”,哈哈。因此果断购入《Java并发编程的艺术》一书,学习...

2028
来自专栏杨建荣的学习笔记

操作系统存储管理和oracle数据库(第二篇) (r4笔记第45天)

在之前分享过第一篇 关于操作系统存储管理和oracle数据库 http://blog.itpub.net/23718752/viewspace-1359146/...

2584
来自专栏贾老师の博客

Linux 系统监控

1442
来自专栏CSDN技术头条

Schemaless架构(二):Uber基于MySQL的Trip数据库

ber的Schemaless数据库是从2014年10月开始启用的,这是一个基于MySQL的数据库,本文就来探究一下它的架构。本文是系列文章的第二部分;第一部分是...

1987
来自专栏JAVA高级架构

大型网站系统与 Java 中间件实践

第一章 分布式系统介绍 分布式系统的定义:组件分布在网络计算机上,组件间仅仅通过消息传递来通信并协调行动。 分布式系统的意义: 升级单机处理能力的性价比越来越...

3417

扫码关注云+社区