共计 1186 个字符,预计需要花费 3 分钟才能阅读完成。
更多内容,欢迎关注微信公众号:全菜工程师小辉。公众号回复关键词,领取免费学习资料。
什么是 session?
服务器为每个用户创建一个会话,存储用户的相关信息,以便多次请求能够定位到同一个上下文,这个相关信息就是 session。这样,当用户在应用程序的 Web 页之间跳转时,存储在 session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。
session 是对 http 无状态协议的补充,达到状态保持的目的
什么是 session 一致性问题?
假设用户包含登录信息的 session 都记录在第一台 server 上,反向代理如果将请求路由到另一台 server 上,可能就找不到相关信息,而导致用户需要重新登录。
解决方法
1. 客户端保存 cookie
- 优点:
- 服务端不需要存储
- 缺点:
- 每次 http 请求都携带 session,占网络带宽
- 数据存储在客户端上,并在网络传输,存在泄漏、篡改等安全隐患
- session 存储的数据大小受 cookie 限制
由于技术不断演进,客户端保存 cookie 出现了信息全量 cookie,cookie 存储 sessionId 和 JWT 三种方式,他们优缺点各异,可以点击笔者的另一篇博客查看相关介绍
快速了解会话管理三剑客 cookie、session 和 JWT
2. session 复制方法
- 思路:
多个 server 之间相互同步 session,这样每个 server 之间都包含全部的 session
- 优点:
- 只需要设定配置,应用程序不需要修改代码
- 不足:
- session 的同步需要数据传输,占内网带宽,有延时
- 所有 server 都包含所有 session 数据,数据量受最小内存的 sever 限制,水平拓展能力差
3. session 中心存储
- 思路:
将 session 存储在 server 后端的集中式缓存
- 优点:
- 没有安全隐患
- 可以水平扩展,支持缓存集群或横向拓展
- 不足:
- 增加了一次网络调用
- 需要修改应用代码
4. session 会话粘连
session 会话粘连:英文原词为 ”Sticky Sessions”
- 思路:
反向代理层让同一个用户的请求保证落在一台 server 上呢?
- 方法一:四层代理 hash。反向代理层使用用户 ip 来做 hash,以保证同一个 ip 的请求落在同一个 server 上(更推荐,保证传输层不引入业务层的逻辑)
- 方法二:七层代理 hash。反向代理使用 http 协议中的某些业务属性来做 hash,例如 sid,city_id,user_id 等,能够更加灵活的实施 hash 策略,以保证同一个浏览器用户的请求落在同一个 server 上
- 优点:
- 只需要改 nginx 配置,不需要修改应用代码
- 可以支持 server 水平扩展
- 不足:
- server 水平扩展,rehash 后 session 重新分布,会有一部分用户路由不到正确的 session
- 即使 hash 散列均匀,也不能保证 server 的负载均匀
更多内容,欢迎关注微信公众号:全菜工程师小辉。公众号回复关键词,领取免费学习资料。
正文完
发表至: java
2019-09-03