服务器端Session和SNA
SNA(Share NothingArchitecture)最近讨论的蛮多的,大概就是为了应用服务器的可伸缩性,而不在应用服务器端保存状态信息。具体到J2EE webapp来说,就是不使用HttpSession在本地保存会话状态,而把会话状态保存到其它地方如Memcached中,这样部署多个Tomcat来服务时,任何机器都可以向客户端提供服务。下面我就服务器端状态数据类型(生命周期)来分析,看看怎样构建高性能的SNA。
第一种服务器端状态数据:应用系统运行所需要的数据,如用户权限部分包括用户名、角色名,这些数据是在整个应用系统都必须存在。这部分数据应该保存在Memcached中,并且当某个应用页面修改后,要和Memcached同步。即应用系统中要保存一份、Memcached中也要保存一份,这样当某一Tomcat停止服务时,其他正常运行的Tomcat可以继续提供服务而不会出现要求重新登入等情况。
第二种服务器端状态数据:在几个页面里传递数据,如多个的注册页面或者查询页面和显示页面分开的情形。这部分数据相对于第一种数据变化较大,如果保存到Memcached中的话,要和Memcached多次交互访问,所以就直接保存在本地即用HttpSession来保存。这样的好处就是不需要和Memcached多次交互,而且负载均衡方案最好是使用IP per Server,就是每个IP即其后续的访问都由一个Tomcat来提供服务。当某Tomcat停止服务时,只会丢失一部分较少的数据。
第三种服务器状态数据:永久持久化数据如数据库数据。这部分我不是很了解。方案应该有许多,可以把常访问的行数据或者较少行的表数据放到Memcached中,应用程序先访问Memcached,如果找不到则再访问数据库。(好像超出本文范围呢,等我以后研究清楚再来)
对于第一二种来说,本地HttpSession相当于一级cache,而Memcached则为二级cache,这样的应用结构蛮清晰的。
PS:本人才疏学浅,目前在学习高性能互联网架构,写的有错误的地方,欢迎一起探讨。