分布式web应用session机制研究
session机制对于初学者来讲是有些难于理解的,在此探讨一下session的机理。希望对读者能够提供帮助。
由于http协议是一种无状态的协议。即协议本身并没有规定建立连接的客户端和服务器端之间需要存储一些内容。但是随着web技术的发展以及互联网商业的兴起,为了构建更加复杂的更加人性化的网络应用,必须有一种机制来保存客户端和服务器端连接的信息。比如最简单的登录功能。在早期的互联网中html被设计用来显示网页文档,却没有考虑如何用html构建可以交互的类似于客户端软件用户体验的机制。因为http协议是无状态的,也就从协议层面无法解决登录的问题。为了解决这种问题,才产生了session的机制。
实际上,session的原理很简单。就是浏览器维护一个web应用生成的唯一的标示,当发送请求时这个唯一标示被传递到web应用,web应用根据此标示找到之前用户存储在web应用中的信息。
常见的维护session机制有以下几种方式。
1. 如果浏览器没有给web服务器唯一标示,web服务器则认为这个用户第一次使用,生成一个唯一标示并将唯一标示通过响应头中的 Set-Cookie:传递给浏览器,浏览器处理后将唯一标示存储以备下一次向web服务器发出请求时添加唯一标示信息。此唯一标示可以存储在浏览器中的cookie中或者直接写在url里面,以方式浏览器禁用cookie的情况。
2.还有一种方式,就是直接将session中的信息对称加密后直接存储在浏览器中的cookie中。浏览器负责管理cookies。
针对于第一种session机制服务器存储session主要有以下几种方式。
1. 直接存储在web服务器的内存中。实际上就是一个键值对, 键为维护session的唯一标示,值为session的内容。web应用负责从http请求中获取唯一标示,这样web端代码就可以访问拿到之前存储的session了。
2. 将session信息存储在数据库中,数据库可以选择postgresql、mysql等关系数据库,也可以选择mongodb、redis等nosql产品。这样就节省了web服务器的内存占用。
针对于第二种session机制session本身就不需要在web服务器中存储,因为session信息浏览器都会传递到web应用中,web应用直接解密即可使用。
在web应用服务器为单机的情况下,此种以上session机制没有问题,但是睡着网络应用越来越发达,现代web应用的典型架构都为分布式集群环境。此时session机制会出现一些问题需要解决。
1. 如果后端web应用服务器多余两个,在内存存储session的情况下会出现问题。因为反向代理会转发请求到后端的任何一台web应用服务器,可能出现用户本来为登陆状态突然变成未登录状态等类似的现象。解决方法有两个:
1).修改反向代理的负载均衡算法,比如改为 ip hash算法等能够将同一个浏览器的不同请求路由到同一台web应用服务器的算法。
2) .session机制采用第二种,web应用不存储session,当然也就没有这个问题了。
3)采用session共享机制。一种是单列出来一台服务器作为session服务器供其他web应用服务器查询session使用。或者多个web应用服务器间建立沟通机制做到一台web应用服务器和其他web应用存储的session一致。第二种同步session机制在web服务器较多的情况web应用性能会下降的很厉害,不建议使用。
2. 第二种session机制中,由于session本身存储于cookie中,而cookie有大小限制。所以使用此种session机制的应用只能存储一些简单的如userId等简单内容。