我有一个grails应用程序,它使用memcached来存储请求结果。
根据请求,缓存中存储的结果很小(100kb),50K请求正常工作,但在一种情况下,如果结果大约为800kb,则应用程序会在超过1K请求分钟时抛出异常。
我试着在最近两天解决这个问题,但所有答案都没有定论。我开始认为问题出在ElastiCache上。
对于实施,我使用AWS ElastiCache群集客户端,即spymemcached的分支。
我尝试修复将客户端更改为默认的spymemcached和xmemcached,但错误是相同的。
例外是:java.util.concurrent.ExecutionException:net.spy.memcached.internal.CheckedOperationTimeoutException:操作超时。
我的服务实施:
import net.spy.memcached.*
import grails.converters.JSON
import org.springframework.beans.factory.InitializingBean
class MemCacheService implements InitializingBean {
String ELASTIC_CACHE_CLUSTER_IP = "teste.ptsfty.cfg.use1.cache.amazonaws.com";
def ELASTIC_CACHE_CLUSTER_PORT = 11211
def MemcachedClient client
def expireTime = 21600
def void afterPropertiesSet() {
client = new MemcachedClient(new InetSocketAddress(ELASTIC_CACHE_CLUSTER_IP, ELASTIC_CACHE_CLUSTER_PORT));
}
def getDataOnCache(key) {
try {
def result = client.get(key)
if (result) return JSON.parse(result)
else return null
} catch(Exception e) {
println e.getMessage()
return null
}
}
def saveOnCache(key, value) {
try {
def result = client.add(key, expireTime, value);
return result
} catch(Exception e) {
println e.getMessage()
return null
}
}
def removeOnCache(key) {
def result = client.delete(key);
return result
}
}
答案 0 :(得分:1)
如果Elasticache在连接数增加时停止工作,请尝试增加memcached_connections_overhead参数。您的Elasticache实例可能内存不足,无法处理传入连接。每个实例使用少量内存来处理每个连接,此参数通常具有较低的默认值。