一、应用无状态(淘宝session框架)
俗话说,一个系 统的伸缩性的好坏取决于应用的状态如何管理。为什么这么说呢?咱们试想一下,假如我们在session中保存了大量与客户端的状态信 息的话,那么当保存
状态信息的server宕机的时候,我们怎么办?通常来说,我们都是通过集群来解决这个问题,而通常所说的集群,不仅有负载均衡,更重要的是要有失效恢复failover,比如
tomcat采用的集群节点广播复制,jboss采用的配对复制等session状 态复制策略,但是集群中的状态恢复也有其缺点,那就是严重影响了系统的伸缩性,系统不能通过增加
更多的机器来达到良好的水平伸缩,因为集群节点间session的 通信会随着节点的增多而开销增大,因此要想做到应用本身的伸缩性,我们需要保证应用的无状态性,这样集群
中的各个节点来说都是相同的,从而是的系统更好的 水平伸缩。
OK, 上面说了无状态的重要性,那么具体如何实现无状态呢?此时一个session框架就会发挥作用了。幸运的是淘宝已经具有了此类框架。淘宝的session框架采用的是
client cookie实现,主要将状态保存到了cookie里 面,这样就使得应用节点本身不需要保存任何状态信息,这样在系统用户变多的时候,就可以通过增加更多的应用节点来达
到水平扩展的目的.但 是采用客户端cookie的 方式来保存状态也会遇到限制,比如每个cookie一般不能超过4K的大小,同时很多浏览器都限制一个站点最 多保存20个cookie.淘
宝cookie框 架采用的是“多值cookie”, 就是一个组合键对应多个cookie的 值,这样不仅可以防止cookie数量超过20, 同时还节省了cookie存储有效信息的空间,因为默认每个
cookie都会有大约50个字节的元信息来描述cookie。
备注:
① 在这里讲一下,淘宝cookie的跨域的用法(个人想法) http://blog.csdn.net/sun305355024sun/article/details/40860101
② 多值cookie的写法
//多值Cookie的写法
//方式1:
Response.Cookies["userinfo1"]["name"].value="1";
Response.Cookies["userinfo1"]["last"].value="1";
Response.Cookies["userinfo1"].Expires=DateTime.MaxValue;
//方式2:
HttpCookie cookie = new HttpCookie("userinfo1");
cookie.Values["name"]="mike";
cookie.Values["last"]="a";
cookie.Expires=DateTime.MaxValue;
//cookie.Expires = System.DateTime.Now.AddDays(1);
Response.Cookies.Add(cookie);
//多值Cookie的读取
If ( Request.Cookies["userInfo1"]!=null )
{
string name=Request.Cookies["userInfo1"]["name"];
string last=Request.Cookies["userInfo1"]["last"];
}
除 了淘宝目前的session框架的实现方式以外,其实集中式session管理来完成,说具体点就是多个无状态的应用节点连接一个session 服务器,session服务器将
session保存到缓存中,session服务器后端再配有底层持久性数据源,比如数据库,文件系统等等。
二 有效使用缓存(Tair)