开发者社区 问答 正文

ehcache集群缓存不同步问题:报错

使用EhCache2.52,做缓存,缓存用的Spring3.1注解,测试用两台服务器集群EhCache,出现缓存不同步问题,访问两台服务器都各自缓存了,A服务器缓存更新,访问B服务器依旧是旧的缓存数据,数据没更新。

A服务器ehcache.xml中缓存配置如下:

<cacheManagerPeerProviderFactory     

     class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"     

     properties="hostName=192.168.3.111,    

     port=4567,    

     socketTimeoutMillis=2000,    

     peerDiscovery=manual,    

     rmiUrls=//192.168.3.211:4567/param"

/>

<cache

name="param"

maxElementsInMemory="10000"

maxElementsOnDisk="10000000"

eternal="true"

overflowToDisk="true"

diskPersistent="true"

memoryStoreEvictionPolicy="LFU">

<cacheEventListenerFactory

         class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"

         properties="replicateAsynchronously=true,

     replicatePuts=true,

     replicateUpdates=true, 

         replicateUpdatesViaCopy=false,  

     replicateRemovals=true"/>

</cache>

B服务器ehcache.xml中缓存配置如下:

<cacheManagerPeerProviderFactory     

     class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"     

     properties="hostName=192.168.3.211,    

     port=4567,    

     socketTimeoutMillis=2000,    

     peerDiscovery=manual,    

     rmiUrls=//192.168.3.111:4567/param"

/>

<cache

name="param"

maxElementsInMemory="10000"

maxElementsOnDisk="10000000"

eternal="true"

overflowToDisk="true"

diskPersistent="true"

memoryStoreEvictionPolicy="LFU">

<cacheEventListenerFactory

         class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"

         properties="replicateAsynchronously=true,

     replicatePuts=true,

     replicateUpdates=true, 

         replicateUpdatesViaCopy=false,  

     replicateRemovals=true"/>

</cache>

也曾尝试使用自动发现

<cacheManagerPeerProviderFactory    

     class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"    

     properties="peerDiscovery=automatic, multicastGroupAddress=230.0.0.1,    

     multicastGroupPort=4446, timeToLive=32"    

/>

以及jsGroups,都无法同步缓存,其中jsGroup最新版的还不能和EhCache2.5.2组合使用,只能用2.X,而且缓存的DAO方法参数中有对象实现了序列化,ehcache-jgroupsreplication还会报错,请问这是何解啊?EhCache如何实现集群啊?

展开
收起
kun坤 2020-06-20 10:55:49 1286 分享
分享
版权
举报
阿里云 AI 助理回答

EhCache 2.5.2 版本在集群环境下确实可能会遇到缓存同步问题,尤其是当你使用较旧的配置方式和协议时。你所描述的问题可能源于几个方面:

  1. 网络配置与发现机制:你的手动配置中,A服务器指定了B服务器的地址,而B服务器又反过来指定A服务器的地址。理论上这应该能工作,但确保两台服务器间的网络通信没有被防火墙或安全组规则阻断。

  2. RMI配置:RMI(远程方法调用)是EhCache早期版本用于集群通信的方式,但它相对脆弱且配置复杂。你需要确认两台服务器的RMI端口(4567)对外开放,并且RMIUrls设置正确无误。同时,RMI的稳定性依赖于JVM及网络环境,有时会因网络波动导致连接不稳定。

  3. 异步复制:你在配置中设置了replicateAsynchronously=true,这意味着更新不是立即同步的,可能存在一定的延迟。如果对实时性要求高,可以尝试改为同步模式测试,尽管这可能影响性能。

  4. 序列化问题:如果你的缓存项包含自定义对象,这些对象必须实现Serializable接口以支持跨网络传输。确保所有放入缓存的对象都正确实现了序列化。

  5. 替代方案:鉴于EhCache 2.5.2已经是较老的版本,它对于现代分布式系统的需求可能支持不够好。考虑升级到EhCache 3.x或者转向其他更现代、功能更全面的缓存解决方案,如 Hazelcast、Infinispan 或者 Redis,这些通常提供了更好的集群支持和数据一致性保证。

  6. JGroups整合问题:虽然你提到尝试了jsGroups(可能是想指JGroups),但遇到了兼容性和序列化问题。JGroups是一个强大的组播通信库,常用于分布式系统的成员发现和消息传递。如果要使用EhCache与JGroups结合,确保使用的EhCache版本与JGroups插件兼容,并且仔细检查序列化需求,因为自定义对象序列化错误是常见的问题点。

综上所述,解决当前问题可能需要从多个角度入手,包括但不限于调整配置、优化网络环境、检查序列化实现等。考虑到技术演进,长远来看,评估并迁移到更现代的缓存解决方案可能是更优的选择。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等