Web应用Session会话共享方案

2022-12-28

在传统应用开发中, 应用服务器是基于内存进行Session会话管理的。也即, 不同的应用服务器, 其Session会话管理是独立, 各自管理的。这就意味着在基于负载均衡的服务器集群中, 假如机器宕机, 或者其他原因导致某台机器不能服务, 那么用户在路由到其他应用服务器时, 将出现Session会话丢失。因此, 为了实现高可用、无缝跳转, 需要实现多机Session会话共享。

一、互联网常用解决思路

(一) 基于负载均衡器的ip哈希

该方案的原理很简单, 在负载均衡器设置, 按照ip进行哈希, 路由到相应的应用服务器。也即, 每个用户每次访问都会路由到相同的固定的应用服务器。这样, 就避免了session会话复制的问题。但是该方案有个缺点, 就是服务器集群当中, 如果某台机器不能访问, 那么用户会按照ip哈希到其他机器, 这个时候出现session丢失。因此, 此方案适合于一旦机器丢失, 可以允许session丢失, 重新登录的情况。

(二) 基于cookies

将session会话信息, 压缩并用对称加密算法加密后, 存放到cookies当中。从而实现在cookies中实现session会话共享。由于cookies能存放的信息比较小, 因此此此方案不能存放太多的session会话信息。此方案比较简单, 适合于会话信息比较小的情况。

(三) Session会话同步集群

也即通过广播的形式, 实现服务器集群的session会话同步。这样, 集群中的任何一台机器的session会话都保持一致。

此方案有个缺点, 就是由于需要在各个服务器之间同步数据, 因此性能低下。特别是在大并发的情况下, 容易造成性能瓶颈。因此, 此方案, 一般适合于小规模并发的情况下, 并且对性能要求不高的应用。

(四) 基于缓存的Session会话共享

此方案是扩展了应用服务器对Session会话的管理, 也即, 通过修改了Session会话的存储和读取方式, 将Session会话存放与独立于应用服务器的数据库或者缓存框架中, 比如数据库、Redis、Memcache等。此方案将session会话存放在外部介质存储中。因此, 能实现无缝的会话共享, 并实现高可用。不过, 此方案也有一个缺点, 那就是由于需要频繁读取外部介质, 因此, 对性能造成一定影响, 并且在会话存储也会形成瓶颈, 从而对并发数有一定限制。

二、基于分布式缓存的Session共享方案

结合互联网的常用解决方案, 在这里, 提出一种性能良好, 并且能够实现Session会话共享的方案, 结构如图1。

此方案有如下几个特点:在负载均衡器端按照ip哈希, 或者其他来路哈希, 确保在服务器都正常的情况下, 用户能够路由到相应的服务器;在本地有Session数据, 从而避免频繁读取外部Session;只有在应用服务器不能访问的情况, 用户路由到其他应用服务器, 本地Session没有数据, 才会去外部Session读取数据。高可用、性能良好;适合于大并发, 并且需要实现高可用Session共享的大型Web项目。

(一) 设计原理

Web中间件内部的SessionManager, 其自身实现了Default的SessionManager是基于服务器内存。通常Web中间件的Session管理机制是可扩展的, 以Web容器Jetty为例, Jetty提供了可扩展能力并提供了一个基于JDBC的Session共享实现。该JDBC的Session共享方案是将Session会话存储到数据库当中。并且在本地也有session会话的副本。我们可以参考JDBC的Session共享实现, 实现一套基于分布式缓存 (Redis) 的Session会话共享。

(二) 交互流程图

会话存储:

会话重建:

三、结束语

本文参考互联网思路设计实现基于分布式缓存的Session共享机制, 目前该实现方案已经在项目中应用, 性能良好运行稳定, 有效的提升了Web应用的稳定性和可靠性。

摘要:传统应用开发中, 应用服务器是基于内存进行Session会话管理的, 假如机器宕机, 或者其他原因导致某台机器不能服务, 那么用户在路由到其他应用服务器时, 将出现Session会话丢失。随着企业用户越来越多、访问量越来越大, 保障系统高可用、无缝跳转是企业Web应用需要实现的重要技术点, 本文就Web应用Session会话共享方案进行设计。

关键词:高可用,无缝跳转,Session共享,分布式缓存

上一篇:公路路桥施工中的软土地基处理探讨下一篇:口腔颌面部严重感染合并糖尿病的治疗过程探讨