背景:
我们有4个物理服务器(4个IPS),每个服务器运行在JBOSS 6 EAP中,运行在端口80上。所有请求都通过负载均衡器重定向到这些服务器中的任何一个。现在,我尝试为这种分布式env实现Java缓存系统,以便在每个服务器缓存中更新我们的属性。
POC :为此,我们在实现JCSv1.3横向缓存的本地系统上做了一个小的POC。在我们的maven项目中启用了它。.ccf文件中使用了以下配置:
jcs.default=
jcs.default.cacheattributes=org.apache.jcs.engine.CompositeCacheAttributes
jcs.default.cacheattributes.MaxObjects=1000
jcs.default.cacheattributes.MemoryCacheName=org.apache.jcs.engine.memory.lru.LRUMemoryCache
# PRE-DEFINED CACHE REGION
##############################################################
##### AUXILIARY CACHES
# LTCP AUX CACHE
jcs.auxiliary.LTCP=org.apache.commons.jcs.auxiliary.lateral.socket.tcp.LateralTCPCacheFactory
jcs.auxiliary.LTCP.attributes=org.apache.commons.jcs.auxiliary.lateral.socket.tcp.TCPLateralCacheAttributes
#jcs.auxiliary.LTCP.attributes.TcpServers=152.144.219.209:8080
jcs.auxiliary.LTCP.attributes.TcpListenerPort=1118
jcs.auxiliary.LTCP.attributes.UdpDiscoveryAddr=228.5.6.8
jcs.auxiliary.LTCP.attributes.UdpDiscoveryPort=6780
jcs.auxiliary.LTCP.attributes.UdpDiscoveryEnabled=true
jcs.auxiliary.LTCP.attributes.Receive=true
jcs.auxiliary.LTCP.attributes.AllowGet=true
jcs.auxiliary.LTCP.attributes.IssueRemoveOnPut=false
jcs.auxiliary.LTCP.attributes.FilterRemoveByHashCode=false
jcs.auxiliary.LTCP.attributes.SocketTimeoOt=1001
jcs.auxiliary.LTCP.attributes.OpenTimeOut=2002
jcs.auxiliary.LTCP.attributes.ZombieQueueMaxSize=2000以及实现getter和setter方法,用于在缓存中保存字符串属性并从缓存中获取字符串属性。
public void addProp(String propId)
throws PimsAppException {
try {
configMSCache.put(propId, propId);
} catch (CacheException e) {
e.printStackTrace();
}
}
@Override
public String testProp(String propId) throws PimsAppException {
if(configMSCache!=null){
return (String) configMSCache.get(propId);
}else{
return "It dint work";
}
} 应用程序部署得很好,在启动时没有出错。
测试方法:在本地服务器和具有不同IP的远程服务器中部署了project.war。两台机器都在同一个网络中,因此在访问对方IP时没有防火墙问题。已经在我的服务器上保存了一个属性并得到了它。(工作正常)试图通过远程机器通过我的本地获得保存的属性。(它返回空白响应)。表示无法实现分布式缓存功能。
怀疑: 1.是否正确地设置了辅助缓存?我指的是配置2,我是正确地测试它,还是如何在dev环境中测试它。3.作为JCS发现,允许我们在多台机器上支持相同的配置,那么为什么它能够在远程机器上工作呢? 4.或者是否有任何缓存机制,有良好的示例和文档可以满足我的应用程序需求(如背景部分所述)。
提前谢谢。
发布于 2016-03-17 15:52:21
这个答复可能太迟了。但我会建议以防万一,记录两台服务器上的统计数据,然后查看。可能它正在传播缓存,但仅在处理时间内,存在读取它的问题。例如:
JCSAdminBean admin = new JCSAdminBean();
LinkedList linkedList = admin.buildCacheInfo();
ListIterator iterator = linkedList.listIterator();
while (iterator.hasNext()) {
CacheRegionInfo info = (CacheRegionInfo)iterator.next();
CompositeCache compCache = info.getCache();
System.out.println("Cache Name: " + compCache.getCacheName());
System.out.println("Cache Type: " + compCache.getCacheType());
System.out.println("Cache Misses (not found): " + compCache.getMissCountNotFound());
System.out.println("Cache Misses (expired): " + compCache.getMissCountExpired());
System.out.println("Cache Hits (memory): " + compCache.getHitCountRam());
System.out.println("Cache value: " + compCache.get(propId));}
https://stackoverflow.com/questions/34453492
复制相似问题