ehcache支持两种拓扑结构,一种是Distributed Caching,另一种是Replicated Caching
Distributed Caching
这和一般意义上的分布式缓存非常类似,这一类型的缓存是有client-server之分的,application通过client向server端请求缓存数据,在server端,数据是散列到多个节点上的。具体而准确的拓扑结构见下图(该图正是Terracotta Server Array的拓扑结构,ehcache的分布式实现是依赖Terracotta Server Array实现的):
一方面:L1是客户端结点,基于Terracotta Server Array的ehcache集群是由L1和L2共同组成的,它们一起共享应用程序的状态和数据。L1相当于一级缓存,存储当前应用结点上的“hot-set”数据。L1各结点上数据可能是不一样的。
另一方面:L2作为二级缓存,将储存所有L1结点上的数据,作为所有缓存数据的一份完整拷贝。在L2上,所有数据会均匀散列到MirrorGroup上,从而成为典型的“分布式”缓存,同时,每个MirrorGroup会有一个active结点和0到多个standby(passive)结点,standby结点是active结点的备份,一单active结点当机,standby结点就将自动成为active节点,从而确保一个MirrorGroup的可靠性,也即所谓的“分区容错性”(Partition Tolerance) 。
应该说,Terracotta Server Array的拓扑结构在水平伸缩和可靠性上都是非常理想的,但是非常遗憾的是,Terracotta Server Array只在商业版的ehcache中提供,换言之,开源版本的ehcache是无法实现标准意义上的“分布式缓存”的。
Replicated Caching
和Distributed Cacheing相比,Replicated Caching并不具有太多的优势,特别是在scale out方面。Replicated Caching和应用服务器集群的session复制非常类似,其作用仅限于确保在集群环境下各应用结点的缓存数据保持一致。ehcache的缓存复制支持rmi,jms,cache server等多种方式。
初步结论
如果你需要在开源产品范围内寻找真正的分布式缓存,echache可能不是你想要到的,memcached可能是一个不错的选择。当然,限于时间问题,我对ehcache,特别是Replicated拓扑结构的caching研究地不是很深入,如果读者有关于如何基于开源版本的ehcache实现分布式集群的经验,欢迎指正。