SNA -- Shared Nothing Architecture研究
现在我们的项目用户session都存放在每个web server中ThreadLocal还保存,如果是多个服务器部署的web app的话,需要每台服务器同步共享Session。
<jboss-web>
<replication-config>
<replication-trigger>SET_AND_NON_PRIMITIVE_GET</replication-trigger>
<replication-granularity>SESSION</replication-granularity>
<replication-field-batch-mode>true</replication-field-batch-mode>
</replication-config>
</jboss-web>最近那就了一下SNA发现这种方式确实是一种很好解决session在web contianer中共享的方式。
Shared Nothing Architecture(无分享架构)是一个分布式的架构,每个节点都是独立的。典型的SNA系统会集中存储状态的信息,如:数据库中,内存cache中;不在节点上保存状态的信息。 对于server集群,若将session等状态保存在各个节点上,那么各个节点的session复制会极大的影响性能;若采用SNA,保持每个节点的无状态性,不再使用session来保持全局的状态,而是将session直接放在数据库中,在数据库前再加一层分布式Cache(推荐使用memcached),这样将可极大的提高性能,当改变session中的对象时,同步到cache和数据库。
对Web Servers做集群时如果将session等状态保持在各个节点上,这样状态的复制就很成问题,所以SNA告诉你在节点上不要保存状态,session这种东西可以存在数据库或内存缓存中嘛,然后cookie或URL中带一个加密string用来查询session状态就可以完美解决session状态了。
但显然这给数据库增加了压力,但是数据库的处理能力比Web Servers做session复制要好多了。况且我们在数据库前加一memcached将大量的数据库Reads的工作做了,而数据库只用处理数量不多的Writes工作,这大大提高了系统的性能。每个Web Server节点里不用cache,而是外部分布式memcached或session server,这同时避免了cache-coherence问题。
对于大型的互联网应用的话,未来一定要通过无session状态化,session中心化的方式解决,通过memcached方式存储session,并设置memcached的过期时间,这样可以降低应用的耦合度,增强了扩展性,提高服务器处理的吞吐量。