Keywords:Ehcache, RMI Replicated Caching, 集羣
Ehcache用戶手冊
Ehcache支持RMI、JMS、JGroups等多種集羣環境下的緩存複製策略,具體可以參考Ehcache官方的用戶手冊:http://ehcache.org/documentation/index.html
選型:RMI Replicated Caching
查了很多資料,最終選擇了RMI的緩存複製策略,主要是由於它配置起來比較簡單,並且不依賴於第三方的jar包,目前也僅僅是在實驗階段,爲了快速搭建原型環境。
因歸正傳
關於在集羣環境下配置Ehcache的RMI複製策略,網上有很多現成的資料,官方網站的RMI Replicated Caching也有非常詳細的講解。但網上的大部分資料都是通過修改Ehcache.xml配置文件,增加cacheManagerPeerProviderFactory、cacheManagerPeerListenerFactory,併爲cache配置cacheEventListenerFactory來實現cache的複製策略。
這樣就存在一個問題,只有在Ehcache.xml中配置的cache纔可以實現集羣環境下的複製,如果我們有很多cache需要在集羣環境下實現複製,把他們全部加到Ehcache中工作量會很大,並且容易出錯,以後的擴展性也不夠好。
通過查找官方資料,發現Ehcache有很多API,完全可以程序動態創建可以進行RMI複製的cache,這樣就可以很方便的創建很多支持集羣環境的cache,而不用都配置到配置文件中。
直接上代碼:
1、首先要對Ehcache.xml進行通用性配置,在ehcache節點下增加cacheManagerPeerProviderFactory、cacheManagerPeerListenerFactory配置,這裏使用的是組播方式。
<cacheManagerPeerProviderFactory
class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
properties="peerDiscovery=automatic, multicastGroupAddress=230.0.0.1, multicastGroupPort=4446, timeToLive=32"/>
<cacheManagerPeerListenerFactory class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"/>
2、在程序中動態創建支持RMI複製的cache:
private static final CacheManager singletonManager = CacheManager.getInstance();
CacheEventListenerFactoryConfiguration config = new CacheEventListenerFactoryConfiguration();
config.setClass("net.sf.ehcache.distribution.RMICacheReplicatorFactory");
//config.setProperties("replicateAsynchronously=true," +
// "replicatePuts=true," +
// "replicateUpdates=true," +
// "replicateUpdatesViaCopy=true," +
// "replicateRemovals=true");
CacheConfiguration cacheConf = new CacheConfiguration("myCacheName", maxSize);
cacheConf.addCacheEventListenerFactory(config);
Cache cache = new Cache(cacheConf);//創建支持RMI複製的cache
singletonManager.addCache(cache);//將此cache納入manager管理
集羣中的多個服務器,都用相同的代碼獲取此cache,只要保證cache的名字相同即可。
通過如上配置,"myCacheName” cache已經支持集羣環境下的RMI複製,在集羣中的每個server上通過singletonManager.getCache("myCacheName")即可獲取此cache進行CURD操作。
看看效果吧,集羣中的多個服務器同時執行對此cache的插入操作,其他服務器上都會得到相同的複製。