SNA ( Share Nothing Architecture )最近讨论的蛮多的,大概就是为了应用服务器的可伸缩性,而不在应用服务器端保存状态信息。具体到 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: 本人才疏学浅,目前在学习高性能互联网架构,写的有错误的地方,欢迎一起探讨。