JBossCache in JBoss Cluster

JBossCache in JBoss Cluster
Ref: http://community.jboss.org/wiki/JBossCacheOfficialDocumentation

Cache的目的是为了以空间换时间,一次计算结果为多次重用。
空间可以是实时内存空间、持久化的硬盘空间。时间可以是运算时间、连接时间、传输时间等。

Cache可以分为LocalCache和DistributedCache。
最简单的LocalCache可以通过维护一个ConcurrentHashMap实现。
缺点是:
1,内存有限,容易out of memory (定期清除?持久化?)
2, 需要对全map做concurrency维护,粗粒度的锁定争用会影响性能(树结构维护?)

在一个专业的企业级应用中,cache除了高性能和线程安全的要求,还要支持事务、高可用性、持久化、容错、集群同步等。
JBossCache是一个典型的企业级cache实现,他采用树结构且支持集群和事务特性。
虽然JBossCache这把牛刀也可以在standalone的JS2E应用中用来杀鸡,但我们应该更关心用他在集群环境中怎么杀牛。
JBossCache分为非集群模式(Local)和集群模式。
集群模式根据实现策略又分为replication和invalidation。
1 replication:通过拷贝改变的cache对象来保证与集群中其他cache同步。replication又可细分为同步replication和异步repliation两种,异步replication较快,put以后马上返回,但是replication出错了,事务还是算完成了不回回滚。同步replication要花时间等待其他的cache完成replication的通知才能结束。

2 invalidation: 如果cache状态改变,仅仅是给其他cache发个通知,收到通知的cache把脏数据清除掉。invalidation也可分为同步和异步两种,区别是发送通知的广播方式一个是同步一个是异步。

在jboss cluster中,我们最好通过MBean来部署jboss cache。这样又几个好处:
1,JBoss NS支持Cluster
我们就可以通过JBoss NamingService来访问cache。如果在local NS中查不到cache,jbss NS还会去查cluster中其他的cache。
2,利用MBean的特性
通过CacheMBean, 我们可以方便的管理Cache Service,实时的启动、停止或者改变一些配置,还可以监控到一些cache统计数据。
3,利用 microcontainer的特性
我们可以通过配置XML文件来完成cache相关的所有对象声明。 简而言之,就是利用java reflection和AOP的技术就不用写声明cache的代码了。


<? xml version="1.0" encoding="UTF-8" ?>



< deployment  xmlns ="urn:jboss:bean-deployer:2.0" >



   
<!--  First we create a Configuration object for the cache  -->

   
< bean  name ="ExampleCacheConfig"

         class
="org.jboss.cache.config.Configuration" >

      

       build up the Configuration

      

   
</ bean >

   

   
<!--  Factory to build the Cache.  -->

   
< bean  name ="DefaultCacheFactory"  class ="org.jboss.cache.DefaultCacheFactory" >       

      
< constructor  factoryClass ="org.jboss.cache.DefaultCacheFactory"

                   factoryMethod
="getInstance"   />

   
</ bean >

   

   
<!--  The cache itself  -->

   
< bean  name ="ExampleCache"  class ="org.jboss.cache.CacheImpl" >

      

      
< constructor  factoryMethod ="createnewInstance" >

          
< factory  bean ="DefaultCacheFactory" />

          
< parameter >< inject  bean ="ExampleCacheConfig" /></ parameter >

          
< parameter > false </ parameter >

      
</ constructor >

          

   
</ bean >

   

   
<!--  JMX Management  -->

   
< bean  name ="ExampleCacheJmxWrapper"  class ="org.jboss.cache.jmx.CacheJmxWrapper" >

      

      
< annotation > @org.jboss.aop.microcontainer.aspects.jmx.JMX(name="jboss.cache:service=ExampleTreeCache", 

                         exposedInterface=org.jboss.cache.jmx.CacheJmxWrapperMBean.class, 

                         registerDirectly=true)
</ annotation >

      

      
< constructor >

          
< parameter >< inject  bean ="ExampleCache" /></ parameter >

      
</ constructor >

          

   
</ bean >



</ deployment >  

后记:
1,jboss cache的naga版中,采用 Multi-versioned concurrency control来实现并发。下次再从中总结一下多线程的学习。
2,jboss cache通过结合visitor pattern和command pattern,把对cache node的操作与访问从中隔离出来,不用改变或者扩展node对象就可以添加新的node行为。也就是开闭原则。下次再从中总结一下几种设计模式的经典应用。



你可能感兴趣的:(JBossCache in JBoss Cluster)