分布式Session问题
之前的代码在我们之后一台应用系统,所有操作都在一台Tomcat上,没有什么问题。当我们部署多台
系统,配合Nginx的时候会出现用户登录的问题。
原因
由于 Nginx 使用默认负载均衡策略(轮询),请求将会按照时间顺序逐一分发到后端应用上。
也就是说刚开始我们在 Tomcat1 登录之后,用户信息放在 Tomcat1 的 Session 里。过了一会,请求
又被 Nginx 分发到了 Tomcat2 上,这时 Tomcat2 上 Session 里还没有用户信息,于是又要登录。
解决方案:
-
Session复制
- 优点
无需修改代码,只需要修改Tomcat配置 - 缺点
Session同步传输占用内网带宽
多台Tomcat同步性能指数级下降
Session占用内存,无法有效水平扩展
- 优点
-
前端存储
- 优点
不占用服务端内存 - 缺点
明文存储,存在安全风险
数据大小受cookie限制
占用外网带宽
- 优点
-
Session粘滞
- 优点
无需修改代码
服务端可以水平扩展 - 缺点
增加新机器,会重新Hash,导致重新登录
应用重启,需要重新登录
- 优点
-
后端集中存储 (redis)
- 优点
安全
容易水平扩展 - 缺点
增加复杂度
需要修改代码
- 优点