TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
前言
; o& r5 u; Q, i# i; V7 V7 o! M8 J0 G- ^7 A
通常在web开发中,会话管理是很重要的一部分,用于存储与用户相关的一些数据。对于java开发者来说,项目中的session一般由Tomcat或者jetty容器来管理。
# R; Y( O0 V6 `1 `" _- I
/ a, V2 J3 E! n) d B( r特点介绍0 |8 T5 F a5 v: b
, K, \% p5 f/ M: {1 b
尽管使用特定的容器可以很好地实现会话管理,但是独立容器挂掉或者由于其他原因重启会导致用户信息丢失,并且无法支持分布式集群会话管理。
/ ^! c: W/ e) E2 U9 R5 N" \0 O. U/ k6 c5 O0 a* i0 m& Z) i
上图举例:4 O# n2 w$ i0 t( Z
+ w+ `3 d0 n, l( v; J0 d1 Y
3 V) R# c9 n d+ N( N4 r( e$ D& J& `% U' p+ d
这是一个简单的负载均衡集群架构模型,后端三台Tomcat服务,假设每台服务都使用自己的会话管理,而集群策略是基于加权轮询的方式实现。试想一下,用户是不是永远无法登陆系统?1 H5 `) `) S7 k o
$ E. d3 F' q9 p5 D e) j" @) R当然,你可能会想,我可以使用基于IP_hash的方式实现负载均衡嘛。但是如果地区分布相对单一,产生的hash值分布可能也不会太均匀,那就起不到负载均衡的作用了。
9 O/ A) G( R) h1 i0 ^
& ~# u8 k& z+ y& a/ n! f$ `5 k一般来说,有两种解决方案,session复制和session统一管理。对于session复制,简单的几台还是可以的,但是如果上百台甚至上千台就要考虑复制成本问题了。
4 l* X1 y) o8 c' r& O1 C' M
) Q) B+ n8 D y! ^( j. S" K s对于统一session管理可以是关系型数据库,比如MySql(基本不用,考虑到效率问题);非关系型数据库 redis,memcache等等。 n! a# O# i- `
$ L0 c- K7 S! ]9 o. h解决方案7 x, D* R5 C' X4 m# b6 G
$ O2 ^. h( i6 Y" L- v; F' U( J基于Tomcat的会话插件实现tomcat-redis-session-manager 和tomcat-memcache-session-manager,会话统一由NoSql管理。对于项目本身来说,无须改动代码,只需要简单的配置Tomcat的server.xml就可以解决问题。但是插件太依赖于容器,并且对于Tomcat各个版本的支持不是特别的好
' Y. x. R, J6 b) t/ n3 b1 _8 O3 t0 K
重写Tomcat的session管理,代码耦合度高,不利于维护。
) r0 q7 E2 B+ d: ?# Q
8 M8 E9 A* ?. }使用开源的session管理框架,比如spring_session,既不需要修改Tomcat配置,又无须重写代码,只需要配置相应的参数即可。" C# W A( z8 Q% K, e7 x' {* g
# P% L1 c: F& n6 J( |7 Z5 e+ t8 g
更多关注博客:http://blog.52itstyle.com/archives/759/
3 k4 r+ f+ _% l; W9 [; k& B |
|