分布式会话基本原理

274 阅读1分钟

1 什么是Session

        Session代表着服务器和客户端一次会话的过程,Session对象存储着特定用户会话所需的属性及配置信息,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量不会丢失,而是在整个用户会话中一直存在下去,当客户端关闭会话,或者Session超时失效时会话结束。

2 分布式Session

        在分布式场景下,一个用户的Session如果只存储在一台服务器上,那么当负载均衡器把用户的下一个请求转发到另一个服务器上时,该服务器上没有用户的Session,就可能导致用户需要进行重新登录等操作。

        分布式场景下Session也需要进行分布式处理,而Session分布式处理有三种方式:

        (1) 粘性Session;

        (2) 应用服务器间的Session复制共享;

        (3) 基于缓存的Session共享;

2.1 粘性Session

        即将用户的所有请求都路由到一个服务器节点上,用户的Session也放在这台服务器节点上。

粘性Session需要负载均衡器的配合。

        粘性Session要求用户的所有请求都由一个服务器节点承接,因此其缺陷也比较明显:如果用户对应的服务器节点宕机异常,那么用户的Session将丢失。

2.2 应用服务间的Session复制共享

        每个用户的Session被创建后,就将其复制到所有节点的内存中,这样用户访问每一台服务器,都有其对应的Session。

        同样存在一些问题:

        (1) 应用程序需要对Session进行管理、复制;

        (2) 内存重复占用;

2.3 基于缓存的Session共享

        使用一个单独的存储服务器存储Session数据,这个存储服务器被所有应用服务共享,例如Redis缓存。

        基于缓存的Session共享要求实现HttpSessionWrapper用来存取Session。

        HttpSessionWrapper有很多实现方案,例如配合JWT Token使用、使用Tomcat的RedisSessionManager或者使用spring-session-data-redis。