【问题标题】:What causes Memcache operation failed, giving up exception?什么原因导致 Memcache 操作失败,放弃异常?
【发布时间】:2016-08-19 00:23:09
【问题描述】:

我有一个应用引擎 java 项目,并且正在使用 objectify。我在应用引擎 Web 控制台的“堆栈驱动程序错误报告”视图中偶尔收到堆栈跟踪,与将项目放入内存缓存相关。这是代码:

try {
    TestItem t = new TestItem(...);
    ofy().save().entity(t).now();
} catch (Exception e) {

}

这是我偶尔会看到的错误:

com.googlecode.objectify.cache.MemcacheServiceRetryProxy 调用:Memcache 操作失败,放弃 java.lang.reflect.InvocationTargetException 在 com.google.appengine.runtime.Request.process-i4dx9s2kED3CVcPe(Request.java) 在 sun.reflect.GeneratedMethodAccessor27.invoke(未知来源) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:44) 在 com.googlecode.objectify.cache.MemcacheServiceRetryProxy.invoke(MemcacheServiceRetryProxy.java:68) 在 com.sun.proxy.$Proxy9.putAll(未知来源) 在 com.googlecode.objectify.cache.KeyMemcacheService.putAll(KeyMemcacheService.java:91) 在 com.googlecode.objectify.cache.EntityMemcache.empty(EntityMemcache.java:319) 在 com.googlecode.objectify.cache.CachingAsyncDatastoreService$5.trigger(CachingAsyncDatastoreService.java:445) 在 com.googlecode.objectify.cache.TriggerFuture.isDone(TriggerFuture.java:87) 在 com.googlecode.objectify.cache.TriggerFuture.get(TriggerFuture.java:102) 在 com.googlecode.objectify.impl.ResultAdapter.now(ResultAdapter.java:34) 在 com.googlecode.objectify.util.ResultWrapper.translate(ResultWrapper.java:22) 在 com.googlecode.objectify.util.ResultWrapper.translate(ResultWrapper.java:10) 在 com.googlecode.objectify.util.ResultTranslator.nowUncached(ResultTranslator.java:21) 在 com.googlecode.objectify.util.ResultCache.now(ResultCache.java:30) 在 com.googlecode.objectify.util.ResultWrapper.translate(ResultWrapper.java:22) 在 com.googlecode.objectify.util.ResultWrapper.translate(ResultWrapper.java:10) 在 com.googlecode.objectify.util.ResultTranslator.nowUncached(ResultTranslator.java:21) 在 com.googlecode.objectify.util.ResultCache.now(ResultCache.java:30) 在 com.me.test.Test.putSomethinInMemcache(Test.java:13) ... 引起:com.google.appengine.api.memcache.MemcacheServiceException: Memcache putAll: Unknown exception setting 1 keys 在 com.google.appengine.api.memcache.MemcacheServiceApiHelper$RpcResponseHandler.handleApiProxyException(MemcacheServiceApiHelper.java:69) 在 com.google.appengine.api.memcache.AsyncMemcacheServiceImpl$RpcResponseHandlerForPut.handleApiProxyException(AsyncMemcacheServiceImpl.java:349) 在 com.google.appengine.api.memcache.MemcacheServiceApiHelper$1.absorbParentException(MemcacheServiceApiHelper.java:111) 在 com.google.appengine.api.utils.FutureWrapper.handleParentException(FutureWrapper.java:52) 在 com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:91) 在 com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:89) 在 com.google.appengine.api.memcache.MemcacheServiceImpl.quietGet(MemcacheServiceImpl.java:26) 在 com.google.appengine.api.memcache.MemcacheServiceImpl.putAll(MemcacheServiceImpl.java:115) ... 52 更多

它似乎没有被 try 语句捕获。我只是在前面提到的管理控制台中看到它。

有谁知道这是什么意思,或者我怎么能理解它?我主要担心的是,在此操作失败后,对象的旧副本可能会卡在 memcache 中。

使用objectify 5.1.10。

谢谢

【问题讨论】:

  • 我们经常遇到同样的问题,以至于我怀疑它实际上是一个内存缓存不可用的问题。除非谷歌基础设施是脆弱的(实际上也怀疑)。未知异常困扰着我。

标签: google-app-engine objectify


【解决方案1】:

这是一个 get() 操作。如果在 get() 操作期间 memcache 不可用,Objectify 只会从数据存储中读取。错误已记录,性能会有所下降,但应用程序会继续运行。

从技术上讲,在写入操作期间可能会出现错误(任何 save() 都会清除缓存条目;读取将重新填充缓存)。这在理论上可能会在缓存中留下陈旧的信息。对此没有什么可以真正做的——如果你不能清除缓存条目,它就会被卡在那里。我的建议是,如果您有敏感数据但希望将其缓存,请在缓存条目上设置合理的超时时间(@Cache(expirationSeconds=60) 或诸如此类)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    相关资源
    最近更新 更多