http协议的无状态性催生了cookie技术,也就是用cookie来记录会话信息。如果服务器需要记录该浏览器的信息,就会在http响应头部加上一个setCookie字段,浏览器接收到这个http响应,就会在本地保存cookie信息,然后再下一次访问该站点的时候在http请求首部加上cookie的信息,这样服务器就可以跟踪会话信息了。

session是另一种记录会话信息的机制,但是本质上,session技术仍然是借助cookie技术来实现的,session会把会话信息保存在服务器端,具体是保存在一个逻辑上类似map的结构,服务器会为每一个浏览器设置一个key,然后该浏览器的所有会话信息就会保存在这个key为关键字的map中,然后服务器会把这个key通过cookie传递给浏览器,浏览器在后面的访问中携带该cookie即可。

session的具体实现方式,大致有三类:

1.基于文件,每一个key和对应的会话信息都是一个文件,这种方式比较稳定,但是操作起来麻烦;

2.基于缓存,即放在服务器的内存中,这种方式虽然操作很简单,速度快,但是存储大小受限于服务器内存,而且一旦断电,会丢失所有会话信息;

3.基于cookie,也就是伪session,把会话信息放在了cookie中。


在分布式系统中session会有什么问题?主要是seesion共享问题。假设用户登录了以后,那么用于处理登录的机器A在自己的机器上设置了session,但是用户后续的购物操作被转发到了机器B,这时B机器并没有用户的session信息,所以用户仍需登录。

所以,必须让其他机器也得到session信息才可以。

解决的方法:

1.进程同步,当一个机器需要记录session时,除了在自己机器上记录,还要通过网络方式把session传递给其他的机器,这种办法回增加集群的压力,不是很好。

2.使用cookie,也就是session用cookie来实现,Flask的session机制就是这样实现的,我开始想做一个demo,用ningx负载均衡了两个机器上的flask应用,最后只在一台上设置session,最后另一台也可以得到,上网查询了才知道是flask框架的session机制问题。

3.创建一个集中的session服务,所有其他服务的session业务都需要从该服务中获取。目前来看方案3最好,便于管理,而且解决了共享问题,模块化,将应用与session的实现解耦。一般大公司貌似采用的是方案3。