应用服务器集群的session管理:这是我在一本网站技术架构分析的书上看到的。这一章主要写在高可用架构设计之下服务无状态这一特性下怎么管理会话(session)。以下是几例解决方案(示例图为转载图片):

1.session复制

session复制是早期企业应用系统使用比较多的一种服务器集群Session管理机制。应用服务器开启Web容器的的Session复制功能,在集群中的几台服务器之间同步Session对象,是的每台服务器上都保存所有用户的Session信息,这样任何一台机器宕机都不会导致Session数据的丢失,而服务器使用Session时候,也只需要在本机获取即可。如图:
这里写图片描述
缺点: 只能使用在集群规模比较小的情况下(本人目前也没参与过大集群项目开发),当集群规模比较大的时候,集群服务器之间需要大量的通信进行Session的复制,占用服务器和网络的大量资源,系统负担较大。而且由于用户的session信息在每台服务器上都有备份,在大量用户访问下,可能会出现服务器内存都还不够session使用的情况。

2.session绑定

session绑定可以利用负载均衡的原地址Hash算法实现,负载均衡服务器总是将来源于同一IP的请求分发到同一台服务器上,也可以根据cookie信息将同一个用户的请求每次都分发到同一台服务器上,不过这时的负载均衡服务器必须工作在HTTP协议层上。这样在整个会话期间,用户的所有请求都在同一台服务器上处理,就是把session绑定在某台特定的服务器,保证了session总能在一台服务器上回去。这种方法又被称为会话黏滞。
这里写图片描述
缺点: 该session绑定的方案不符合我们队系统高可用的需求。因为该情况下,一旦某台服务器宕机,则该服务器上的所有session信息就会不存在,用户请求切换到其他服务器后因为没有session信息而无法完成相关业务。所以这种方法用的比较少

3.利用cookie记录session

早期的一些企业应用架构就是C/S(客户端/服务器)架构,管理session 的方法就是讲session记录在客户端,每次请求服务器的时候讲session放在请求中发送给服务器,服务器处理过请求后再将修改过的session返回给客户端。网站虽然没有客户端,但是可以利用浏览器支持的cookie记录session。
当然,有人会说如果客户端禁用掉cookie怎么办。我另一篇文章写过这个相关的简单的解决办法。
客户端禁用Cookie后如何使用Session
这里写图片描述
缺点: 该方法受cookie大小限制,记录的信息有限。每次请求都需要传输cookie,影响性能。
但是,由于cookie简单易用,支持服务器的线性伸缩,而且大部分的session信息都比较小,所以其实很多网站或多或少的都会使用cookie来记录session。

4.session服务器

session服务器就是利用独立部署的session服务器(集群)统一管理session,应用服务器每次读写session时候,都去访问session服务器。
这里写图片描述

该方案实际上就是将应用服务器的状态分离,分为无状态的应用服务器和有状态的session服务器。
对于有状态的session服务器:

一种比较简单的方法就是利用分布式缓存,数据库等,在这些产品的基础上进行包装,使其符合session的存储和访问要求。
另一种就是业务场景对session管理有比较高的要求的时候,可以利用session服务器集成单点登录(SSO),用户服务等功能,
这就需要开发专门的session服务管理平台。

本文是在项目中遇到session相关问题的时候,刚好手头的一本书上有相关解决方法。有其他好的解决方法望留言指点。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐