三种会话状态

1. 客户会话状态

在客户端保存数据,例如:使用URL,Cookie,Web Storage,表单隐藏域,Json全局对象

2. 服务器会话状态

将会话对象以序列化的形式保存在全局变量,内存,文件系统,数据库单个的表中只记录会话编号

3. 数据库会话状态

将会话数据分解到数据库的多个表中

如果系统中有多个用户,使用集群可以提高吞吐率,这种情况下还需要考虑是否使用会话迁移(将一个请求的多个业务逻辑分到不同的服务器上去处理)。与之相反的是服务器亲和(将所有请求在一台服务器上处理)

在无法判断客户是否关闭了这次会话的情况下,推荐使用客户会话状态,或者给服务器会话状态设置超时时间,自动清理不再使用的会话

异常处理:

对于三种异常情况:客户端突然死机,服务器突然死机,网络断开;

数据库会话状态都可以应付;由于会话状态存放在数据库,客户端,服务器,网络出现问题都不能对已经持久化的数据造成任何影响

服务器会话状态能否应付取决于存储的介质,如果存储在内存中可能就丢失了,如果存放在数据库中则可能恢复;

客户会话状态在客户端死机的情况下无法应付,其他情况都可以,想象你在提交一个订单并准备支付时手机电量耗尽了自动关机,下次打开app手机是不会自动跳转到支付界面的;但如果是网络断开的情况呢?大部分情况下会提示网络超时,等到信号变好就可以继续提交订单了

推荐使用服务器和客户会话状态,因为效率更高,也具有一定健壮性;数据库会话状态只适用于需要故障恢复和集群的时候,它的效率比较低

集群环境如何保证同一台客户端发出请求一直能被同一台服务器处理呢?

使用Nginx的ip_hash负载均衡策略确保了相同的客户端的请求一直发送到相同的服务器,以保证session会话。这样每个访客都固定访问一个后端服务器,可以解决session不能跨服务器的问题。

参考:《企业应用架构模式.Martin.Fowler》

你可能感兴趣的:(Web应用,服务器,session)