Memcache 中的 GAE Flexible Environment Service 错误

GAE Flexible Environment Service error in memcache

我使用 jetty9-compat + java8 配置并收到以下异常。可能是因为这个我无法在会话中存储对象,所以最后我无法登录我的服务。

[INFO] cze 28, 2016 11:17:56 AM com.google.apphosting.vmruntime.VmMetadataCache getMetadata
[INFO] 
[INFO] INFO: Meta-data 'attributes/gae_affinity' path retrieval error: metadata
[INFO] 
[INFO] cze 28, 2016 11:17:56 AM com.google.apphosting.vmruntime.VmApiProxyDelegate runSyncCall
[INFO] 
[INFO] INFO: HTTP ApiProxy I/O error for memcache.Get: The target server failed to respond
[INFO] 
[INFO] cze 28, 2016 11:17:56 AM com.google.appengine.api.memcache.LogAndContinueErrorHandler handleServiceError
[INFO] 
[INFO] INFO: Service error in memcache
[INFO] 
[INFO] com.google.appengine.api.memcache.MemcacheServiceException: RCP Failure for API call: memcache Get
[INFO] 
[INFO]  at com.google.apphosting.vmruntime.VmApiProxyDelegate.constructApiException(VmApiProxyDelegate.java:232)
[INFO] 
[INFO]  at com.google.apphosting.vmruntime.VmApiProxyDelegate.runSyncCall(VmApiProxyDelegate.java:195)
[INFO] 
[INFO]  at com.google.apphosting.vmruntime.VmApiProxyDelegate.makeApiCall(VmApiProxyDelegate.java:154)
[INFO] 
[INFO]  at com.google.apphosting.vmruntime.VmApiProxyDelegate.access[=10=]0(VmApiProxyDelegate.java:60)
[INFO] 
[INFO]  at com.google.apphosting.vmruntime.VmApiProxyDelegate$MakeSyncCall.call(VmApiProxyDelegate.java:436)
[INFO] 
[INFO]  at com.google.apphosting.vmruntime.VmApiProxyDelegate$MakeSyncCall.call(VmApiProxyDelegate.java:412)
[INFO] 
[INFO]  at java.util.concurrent.FutureTask.run(FutureTask.java:266)
[INFO] 
[INFO]  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
[INFO] 
[INFO]  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
[INFO] 
[INFO]  at java.lang.Thread.run(Thread.java:745)
[INFO] 
[INFO] 
[INFO] 
[INFO] DEBUG    2016-06-28 11:17:56,493 api_server.py:277] Handled datastore_v3.Get in 0.0000
[INFO] cze 28, 2016 11:17:59 AM com.mysql.jdbc.log.Slf4JLogger logInfo

这个问题只在本地复现,我也遇到了。我假设这是由开发服务器 运行 的本地 memcached 配置不正确引起的。

我会尽力解释我的观点。在我的例子中,第一个请求总是成功的。 因为在第一次请求的情况下,Apache HttpClient 打开一个新连接并将其放入池中。 有源代码https://github.com/GoogleCloudPlatform/appengine-java-vm-runtime/blob/master/appengine-managed-runtime/src/main/java/com/google/apphosting/vmruntime/VmApiProxyDelegate.java

如果以最多 10 秒的间隔执行,所有进一步的请求也会成功。但如果 10 秒内没有请求,则下一个请求失败。 发生这种情况是因为 memcached 服务从其端关闭了连接,但 HttpClient 并不知道。

VmApiProxyDelegate 中,HttpClient 配置为在 60 秒后关闭空闲连接。因此,如果我等待超过 1 分钟而不是 10 秒,我的下一个请求不会失败。因为在这种情况下,HttpClient 打开了尚未关闭的新连接。

为避免此问题,从 memcached 存根端配置连接超时是正确的。但是文档说您对 memcached 的请求可能会失败,您必须处理这些错误。因此,我建议您添加错误处理程序和一些重试机制。

当然,如果您的配置一切正常,以上所有都适合您的情况。考虑到您没有提供配置和代码示例,我假设一切正常。