TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
前言$ h8 M* t0 c! q: Z
0 o4 [) Q3 S! ?
通常在web开发中,会话管理是很重要的一部分,用于存储与用户相关的一些数据。对于java开发者来说,项目中的session一般由Tomcat或者jetty容器来管理。
, y% T8 N- Z( Y" z1 x, s6 w6 s \" ]6 a) P X3 c: V2 ^" J) v
特点介绍
8 V. J, B+ V8 B- E
" i( \9 W* \, t1 J尽管使用特定的容器可以很好地实现会话管理,但是独立容器挂掉或者由于其他原因重启会导致用户信息丢失,并且无法支持分布式集群会话管理。0 h: E5 k7 Q+ I% [ x G( I& h8 M
3 Z& f o4 I0 N- v
上图举例:; @/ A# R, [. _+ e0 {/ n
' s- L' K; s) j4 C$ H2 Z# b$ Y8 c+ Q5 h* C! i
& r; x- L. P. G这是一个简单的负载均衡集群架构模型,后端三台Tomcat服务,假设每台服务都使用自己的会话管理,而集群策略是基于加权轮询的方式实现。试想一下,用户是不是永远无法登陆系统?
9 t7 L" V/ u& c4 Q7 f. E% e$ t; Y. c3 u# T9 g: O. m
当然,你可能会想,我可以使用基于IP_hash的方式实现负载均衡嘛。但是如果地区分布相对单一,产生的hash值分布可能也不会太均匀,那就起不到负载均衡的作用了。
1 l2 U9 U" A3 n& o ^2 P
3 A- G1 T& I# K一般来说,有两种解决方案,session复制和session统一管理。对于session复制,简单的几台还是可以的,但是如果上百台甚至上千台就要考虑复制成本问题了。
1 c+ c) j6 r x) G( \; g: n* i- z0 q. Z/ R* z
对于统一session管理可以是关系型数据库,比如MySql(基本不用,考虑到效率问题);非关系型数据库 redis,memcache等等。; _! S$ q1 a3 q3 z! X
: M/ d: V$ ^) S' `解决方案# X! E6 p2 K0 J2 s6 E5 T# @
- I- T! S( O4 Y! A+ a基于Tomcat的会话插件实现tomcat-redis-session-manager 和tomcat-memcache-session-manager,会话统一由NoSql管理。对于项目本身来说,无须改动代码,只需要简单的配置Tomcat的server.xml就可以解决问题。但是插件太依赖于容器,并且对于Tomcat各个版本的支持不是特别的好
6 l: s% r/ S) y( u* d" h: h- e. f2 J5 \! \. h. u; z1 L* v
重写Tomcat的session管理,代码耦合度高,不利于维护。% L1 Q+ }+ V, a5 \6 M" u
7 w3 H! n/ N, s" P0 v) _, j! m使用开源的session管理框架,比如spring_session,既不需要修改Tomcat配置,又无须重写代码,只需要配置相应的参数即可。
4 k/ S# ]* k: G1 e( @8 f
' m) o, O4 F/ l6 V" v+ M8 S3 K. v$ i8 S; ]& X, ~* [# |
更多关注博客:http://blog.52itstyle.com/archives/759/
" a7 M( U6 K r5 \5 l ] |
|