一、会话管理介绍
1.了解cookie和session
2.cookie工作图
3.session工作图
4.分布式项目不用session的原因
每个session只存在于自身服务器当中,比如A创建了一个session,并将sessionID传给了客户端;客户端再次带着sessionID请求的话,负载均衡将其请求分给了另一台服务器,此时这台服务器里并没有对应的sessionID,或者创建的session里面数据不对应,那么就不好办了!
通常我们会被服务器做一个集群,浏览器与服务器之间也会做一个代理服务器,用于对服务器集群的负载均衡。
此时服务器集群之间的session之间共享就会有以下方式:
粘性session
一个固定的sessionID永远分给同一个服务器处理;
问题:很难保障服务器之间是负载均衡的同步session
某一个服务器创建session并且有数据以后,就会把这个session同步给其他服务器
问题:服务器性能有影响,session对内存压力大;服务器之间会产生耦合,不再是那么独立的共享session
再拿出一台服务器,不处理普通业务,只用来处理session,其他服务器都向这一台服务器获取session
问题:这台服务器是单体的,一旦挂了,其他服务器都不好工作了;如果就这个服务器做负载均衡就没意义,又和之前一样了;主流办法
:
把客户端的身份就不存到session里去了,能存cookie就存到cookie里;一些敏感数据不方便存到cookie里,就存到数据库里,这时再对数据库做一个集群,所有服务器都访问数据库集群来得到关于客户端会话的数据:
缺点:因为传统的关系型数据库都是把数据存到硬盘里,访问数据就会慢;
所以使用非关系型数据库,数据存到内存中,访问速度非常快,比如redis
整个服务架构就是这样: