TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
前言# V) x! W3 b3 G( B4 N
$ b0 I) Y; R% r& S9 p4 V通常在web开发中,会话管理是很重要的一部分,用于存储与用户相关的一些数据。对于java开发者来说,项目中的session一般由Tomcat或者jetty容器来管理。3 |. g# q# ^: G7 o2 ~1 b+ L* ?' p
6 m$ x+ H+ B# J
特点介绍
E% I9 a! E! f, @( m5 P" x9 c- r
! w! `4 P3 d9 L q. r1 _* k/ h尽管使用特定的容器可以很好地实现会话管理,但是独立容器挂掉或者由于其他原因重启会导致用户信息丢失,并且无法支持分布式集群会话管理。- {, t2 b$ c3 @& e
6 c( x$ s9 k0 w! Y
上图举例:0 D, ^) n. o1 h. V3 j1 E- l* a
9 C$ r1 ~ }" R
, {9 e" o E# B' {* u* i
$ h1 R7 y/ @/ U# R, m7 J9 [这是一个简单的负载均衡集群架构模型,后端三台Tomcat服务,假设每台服务都使用自己的会话管理,而集群策略是基于加权轮询的方式实现。试想一下,用户是不是永远无法登陆系统?
9 b# ~5 D. |9 J" b8 q2 A9 h
) D, N, w# {- v: h' q当然,你可能会想,我可以使用基于IP_hash的方式实现负载均衡嘛。但是如果地区分布相对单一,产生的hash值分布可能也不会太均匀,那就起不到负载均衡的作用了。7 S) q# N0 p7 B0 I V
7 t( c7 g2 p1 w6 U. d
一般来说,有两种解决方案,session复制和session统一管理。对于session复制,简单的几台还是可以的,但是如果上百台甚至上千台就要考虑复制成本问题了。) `& o/ Y2 W0 J5 ^+ [
V# M6 }* C) p. [7 i
对于统一session管理可以是关系型数据库,比如MySql(基本不用,考虑到效率问题);非关系型数据库 redis,memcache等等。* @% Q. [& L, ? j' j9 A5 @
?/ X. |% P: e% H解决方案
7 i: N4 @4 C. |. H+ s) R5 {1 h8 l( ] T- a* ~
基于Tomcat的会话插件实现tomcat-redis-session-manager 和tomcat-memcache-session-manager,会话统一由NoSql管理。对于项目本身来说,无须改动代码,只需要简单的配置Tomcat的server.xml就可以解决问题。但是插件太依赖于容器,并且对于Tomcat各个版本的支持不是特别的好
4 M2 @4 N( ~* F- U' j: |8 Z$ l/ r. q
重写Tomcat的session管理,代码耦合度高,不利于维护。+ B5 l. H# x8 M5 Q3 v% l
+ @3 h; ?7 R$ u6 V* k# X2 H# i9 K
使用开源的session管理框架,比如spring_session,既不需要修改Tomcat配置,又无须重写代码,只需要配置相应的参数即可。
& S$ u2 U* P/ v+ t& D6 l0 J$ G9 S" x4 v- r5 n( M6 a0 K
4 k" S% I# \0 f ~2 V! Y+ y3 L, b
更多关注博客:http://blog.52itstyle.com/archives/759/
/ L3 F- J7 k3 j1 [ |
|