1.session 的几个问题
问题1:tomcat中的session保存的位置
存在tomcat的本地ConcurrentHashMap(本地缓存),以sessionId为key
问题2:tomcat如何追踪当前请求属于哪个session
通过cookice:产生会话时向浏览器发送存有sessionId的cookice,后续请求都带上这个cookice。
问题3:session是不是用户登录时候产生的?
不是。两种方式:(1)访问JSP时候默认产生,因为JSP的九大内置对象中有session对象。(2)当后台通过HttpSession session= request.getSession() 创建时才产生。
【问题】:当服务器无法扛起快速增长的用户访问量时怎么办?
1.更换更好的服务器
2.用多台服务器一起服务
【问题】:从架构师的角度如何考量以上方法?
1.成本 高性能or普通服务器
2.性能
3.可用性
4.扩展性
什么是集群?
多台服务器一起来完成同一项繁重就是集群,每台机子都做同样的工作无差别。
2.反向代理-负载均衡
代理的职责:
接收用户请求,再均衡地分发给集群中的机器,拥有强大的并发负载能力。
负载均衡选择
硬的:常见的NetScaler、F5、RadWare和Array
评价:价格贵但提供高可用性和高稳定性
软的:流行的有LVS、haproxy、nginx
评价:开源软件,成本低
----Nginx----
轻量级Web服务器/反向代理服务器及电子邮件代理服务器。
特点
1.占内存少,并发能力强
2.模块化组件,可扩展性强
3.跨平台,linux下性能更优异
适用场景
1.静态HTTP服务器
2.正/反向代理服务器
3.负载均衡
4.虚拟主机
5.电子邮件代理
6.目录保护和访问限制
7.防盗链
8.下载限速
9.web缓存
10.请求转发
负责均衡策略
轮询:轮流访问每台必访问
weight权重:
ip_hash:
轮询方式上加:ip_hash
该策略是指一个客户端只访问特定一台服务器,原理是根据客户端ip做哈希值再取模结果当做数组下标值接着找到对应服务器。
什么是正向代理?
个人PC请求代理服务器(校园网、vpn)
什么是反向代理?
将请求分发给多个后台服务器的其中一台。
3.session一致性问题解决方案
Session丢失问题原因:Nginx将请求分配到无session的机器造成状态的不一致。
解决方案:
ip_hash负载均衡策略 :
做法:修改Nginx配置文件 upstream 内加 ip_hash
优点:仅修改Nginx配置;对代码无入侵不需要改代码;只要hash属性是均匀的,多台server的负载是均衡的;便于水平扩展;安全性高
缺点:服务器重启造成部分session丢失;单点负载高的风险
服务器session复制
多台服务器的session相互同步;
做法:1.修改Tomcat server.xml中的Cluster节点;2.修改应用web.xml,增加节点:<distributable/>
优点:代码无入侵;适应各种负载均衡策略;服务器重启session不丢失;安全性高
缺点:session同步有延迟;占用网络带宽;序列化与反序列化消耗CPU性能
该方式的原理:
单播 组播 广播
session统一缓存
思路:
1.平时用的session都是通过request获取的,业务代码只是用session对象不管存取
2.想办法把tomcat生成的request替换为我们自己写的request,再提供给业务代码使用,在我们的request中替换session的生产、存、取、失效操作。
3.如何替换? -- Filter 拦截器
4.缓存数据库-------redis
使用redis作为统一缓存的做法:
1.增加redis client和spring session的依赖
2.修改web.xml 增加filter: springSessionRFilter;
3.修改spring配置文件,在容器中注入spring session 和redis相关的bean
网友评论