我有一个appengine模块作为后台实例运行(b4,基本缩放),它迭代大量数据并处理它。
当处理较少量的数据时,它会正确运行,但是当数据变大时,我开始获得多个异常。在开始时,InvocationTargetException会导致MemcacheServiceException,然后由LogAndContinueErrorHandler捕获(请参阅此主题:Backend "Process moved to a different machine" and fails withh error 500)。
大约14秒后又有10个类似的错误,“进程移动到另一台机器上”。我建议原因是appengine识别错误并假设实例出现问题并在一段时间后将其关闭。
正如在另一个线程中所建议的那样,我可以确保,移动到另一台机器会使进程保持运行,但由于它确实存在错误,因为某些东西太大/太长,我最好应该处理错误。
错误级联开始时出现错误,错误在com.googlecode.objectify.cache.MemcacheServiceRetryProxy invoke: Error performing memcache operation, retrying: public abstract void
15:49:18.779
com.google.appengine.api.memcache.LogAndContinueErrorHandler handleServiceError: Service error in memcache
com.google.appengine.api.memcache.MemcacheServiceException: Memcache getAll: exception getting multiple keys
at com.google.appengine.api.memcache.MemcacheServiceApiHelper$RpcResponseHandler.handleApiProxyException(MemcacheServiceApiHelper.java:68)
at com.google.appengine.api.memcache.MemcacheServiceApiHelper$1.absorbParentException(MemcacheServiceApiHelper.java:109)
at com.google.appengine.api.utils.FutureWrapper.handleParentException(FutureWrapper.java:51)
at com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:90)
at com.google.appengine.api.memcache.MemcacheServiceImpl.quietGet(MemcacheServiceImpl.java:26)
at com.google.appengine.api.memcache.MemcacheServiceImpl.getAll(MemcacheServiceImpl.java:64)
at com.googlecode.objectify.cache.KeyMemcacheService.getAll(KeyMemcacheService.java:75)
at com.googlecode.objectify.cache.EntityMemcache.cacheGetAll(EntityMemcache.java:346)
at com.googlecode.objectify.cache.EntityMemcache.putAll(EntityMemcache.java:285)
at com.googlecode.objectify.cache.CachingAsyncDatastoreService$3.success(CachingAsyncDatastoreService.java:280)
at com.googlecode.objectify.cache.CachingAsyncDatastoreService$3.success(CachingAsyncDatastoreService.java:269)
at com.googlecode.objectify.cache.TriggerSuccessFuture.trigger(TriggerSuccessFuture.java:38)
at com.googlecode.objectify.cache.TriggerFuture.isDone(TriggerFuture.java:89)
at com.googlecode.objectify.cache.TriggerFuture.get(TriggerFuture.java:104)
at com.googlecode.objectify.impl.ResultAdapter.now(ResultAdapter.java:34)
at com.googlecode.objectify.impl.Round$2.now(Round.java:135)
at com.googlecode.objectify.impl.Round$2.now(Round.java:132)
at com.googlecode.objectify.impl.LoadEngine$1.nowUncached(LoadEngine.java:172)
at com.googlecode.objectify.impl.LoadEngine$1.nowUncached(LoadEngine.java:164)
at com.googlecode.objectify.util.ResultCache.now(ResultCache.java:30)
at com.googlecode.objectify.impl.Round$1.nowUncached(Round.java:73)
at com.googlecode.objectify.util.ResultCache.now(ResultCache.java:30)
at com.googlecode.objectify.LoadResult.now(LoadResult.java:25)
at ch.eaternity.server.DAO.loadEntityNow(DAO.java:383)
at ch.eaternity.server.services.ProductServiceImpl.getProduct(ProductServiceImpl.java:21)
at ch.eaternity.server.CompositeRoot.restoreJavaObject(CompositeRoot.java:237)
at sun.reflect.GeneratedMethodAccessor10.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.google.apphosting.runtime.security.shared.intercept.java.lang.reflect.Method_$1.run(Method_.java:179)
at java.security.AccessController.doPrivileged(Native Method)
at com.google.apphosting.runtime.security.shared.intercept.java.lang.reflect.Method_.privilegedInvoke(Method_.java:176)
at com.google.apphosting.runtime.security.shared.intercept.java.lang.reflect.Method_.invoke_(Method_.java:137)
at com.google.apphosting.runtime.security.shared.intercept.java.lang.reflect.Method_.invoke(Method_.java:45)
at com.googlecode.objectify.impl.ConcreteEntityMetadata.invokeLifecycleCallbacks(ConcreteEntityMetadata.java:167)
at com.googlecode.objectify.impl.ConcreteEntityMetadata.access$000(ConcreteEntityMetadata.java:24)
at com.googlecode.objectify.impl.ConcreteEntityMetadata$1.run(ConcreteEntityMetadata.java:127)
at com.googlecode.objectify.impl.translate.LoadContext.done(LoadContext.java:70)
at com.googlecode.objectify.impl.LoadEngine$1.postExecuteHook(LoadEngine.java:191)
at com.googlecode.objectify.util.ResultCache.now(ResultCache.java:33)
at com.googlecode.objectify.impl.Round$1.nowUncached(Round.java:73)
at com.googlecode.objectify.util.ResultCache.now(ResultCache.java:30)
at com.googlecode.objectify.util.ResultNowFunction.apply(ResultNowFunction.java:20)
at com.googlecode.objectify.util.ResultNowFunction.apply(ResultNowFunction.java:9)
at com.google.common.collect.Iterators$8.transform(Iterators.java:794)
at com.google.common.collect.TransformedIterator.next(TransformedIterator.java:48)
at com.googlecode.objectify.impl.Chunk.next(Chunk.java:27)
at com.googlecode.objectify.impl.Chunk.next(Chunk.java:10)
at com.google.common.collect.Iterators$5.next(Iterators.java:553)
at com.google.common.collect.Iterators$PeekingImpl.peek(Iterators.java:1162)
at com.googlecode.objectify.impl.ChunkingIterator.hasNext(ChunkingIterator.java:52)
at com.google.common.collect.Iterators.addAll(Iterators.java:356)
at com.google.common.collect.Lists.newArrayList(Lists.java:147)
at com.google.common.collect.Lists.newArrayList(Lists.java:129)
at com.googlecode.objectify.util.MakeListResult.translate(MakeListResult.java:21)
at com.googlecode.objectify.util.MakeListResult.translate(MakeListResult.java:11)
at com.googlecode.objectify.util.ResultTranslator.nowUncached(ResultTranslator.java:21)
at com.googlecode.objectify.util.ResultCache.now(ResultCache.java:30)
at com.googlecode.objectify.util.ResultProxy.invoke(ResultProxy.java:32)
at com.sun.proxy.$Proxy23.toArray(Unknown Source)
at java.util.ArrayList.addAll(ArrayList.java:530)
at ch.eaternity.server.DAO.loadCompositeRootsByDateAndKitchenId(DAO.java:1058)
at ch.eaternity.server.services.ReportServiceImpl.loadCompositeRoots(ReportServiceImpl.java:75)
at ch.eaternity.server.services.ReportServiceImpl.loadSupplies(ReportServiceImpl.java:24)
at ch.eaternity.server.reports.GeneralKitchenDataAnalyzer.generateAndSaveConcreteGeneralKitchenData(GeneralKitchenDataAnalyzer.java:45)
at ch.eaternity.server.servlets.ReportGeneratingServlet.kickOffReportDataGeneration(ReportGeneratingServlet.java:75)
at ch.eaternity.server.servlets.ReportGeneratingServlet.doPost(ReportGeneratingServlet.java:46)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
at ch.eaternity.server.NamespaceFilter.doFilter(NamespaceFilter.java:36)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.googlecode.objectify.cache.AsyncCacheFilter.doFilter(AsyncCacheFilter.java:59)
at com.googlecode.objectify.ObjectifyFilter.doFilter(ObjectifyFilter.java:49)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.apphosting.utils.servlet.ParseBlobUploadFilter.doFilter(ParseBlobUploadFilter.java:125)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.apphosting.runtime.jetty.SaveSessionFilter.doFilter(SaveSessionFilter.java:35)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.apphosting.utils.servlet.JdbcMySqlConnectionCleanupFilter.doFilter(JdbcMySqlConnectionCleanupFilter.java:60)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:254)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:326)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923)
<continued in next message>
E
15:49:18.779
<continued from previous message>
at com.google.apphosting.runtime.jetty.RpcRequestParser.parseAvailable(RpcRequestParser.java:76)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:146)
at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:480)
at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:438)
at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:445)
at com.google.tracing.CurrentContext.runInContext(CurrentContext.java:220)
at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:309)
at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:301)
at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:442)
at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:251)
at java.lang.Thread.run(Thread.java:724)
I
15:49:20.272
com.google.appengine.api.memcache.MemcacheServiceApiHelper$RpcResponseHandler handleApiProxyException: Memcache putAll: Unknown exception setting 0 keys:
W
15:49:20.276
com.googlecode.objectify.cache.MemcacheServiceRetryProxy invoke: Error performing memcache operation, retrying: public abstract void com.google.appengine.api.memcache.MemcacheService.putAll(java.util.Map)
java.lang.reflect.InvocationTargetException
at com.google.appengine.runtime.Request.process-fdcbff8350bb99f7(Request.java)
at sun.reflect.GeneratedMethodAccessor11.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:45)
at com.googlecode.objectify.cache.MemcacheServiceRetryProxy.invoke(MemcacheServiceRetryProxy.java:68)
at com.sun.proxy.$Proxy10.putAll(Unknown Source)
at com.googlecode.objectify.cache.KeyMemcacheService.putAll(KeyMemcacheService.java:80)
at com.googlecode.objectify.cache.EntityMemcache.empty(EntityMemcache.java:312)
at com.googlecode.objectify.cache.EntityMemcache.putAll(EntityMemcache.java:296)
at com.googlecode.objectify.cache.CachingAsyncDatastoreService$3.success(CachingAsyncDatastoreService.java:280)
at com.googlecode.objectify.cache.CachingAsyncDatastoreService$3.success(CachingAsyncDatastoreService.java:269)
at com.googlecode.objectify.cache.TriggerSuccessFuture.trigger(TriggerSuccessFuture.java:38)
at com.googlecode.objectify.cache.TriggerFuture.isDone(TriggerFuture.java:89)
at com.googlecode.objectify.cache.TriggerFuture.get(TriggerFuture.java:104)
at com.googlecode.objectify.impl.ResultAdapter.now(ResultAdapter.java:34)
at com.googlecode.objectify.impl.Round$2.now(Round.java:135)
at com.googlecode.objectify.impl.Round$2.now(Round.java:132)
at com.googlecode.objectify.impl.LoadEngine$1.nowUncached(LoadEngine.java:172)
at com.googlecode.objectify.impl.LoadEngine$1.nowUncached(LoadEngine.java:164)
at com.googlecode.objectify.util.ResultCache.now(ResultCache.java:30)
at com.googlecode.objectify.impl.Round$1.nowUncached(Round.java:73)
at com.googlecode.objectify.util.ResultCache.now(ResultCache.java:30)
at com.googlecode.objectify.LoadResult.now(LoadResult.java:25)
at ch.eaternity.server.DAO.loadEntityNow(DAO.java:383)
at ch.eaternity.server.services.ProductServiceImpl.getProduct(ProductServiceImpl.java:21)
at ch.eaternity.server.CompositeRoot.restoreJavaObject(CompositeRoot.java:237)
at sun.reflect.GeneratedMethodAccessor10.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:45)
at com.googlecode.objectify.impl.ConcreteEntityMetadata.invokeLifecycleCallbacks(ConcreteEntityMetadata.java:167)
at com.googlecode.objectify.impl.ConcreteEntityMetadata.access$000(ConcreteEntityMetadata.java:24)
at com.googlecode.objectify.impl.ConcreteEntityMetadata$1.run(ConcreteEntityMetadata.java:127)
at com.googlecode.objectify.impl.translate.LoadContext.done(LoadContext.java:70)
at com.googlecode.objectify.impl.LoadEngine$1.postExecuteHook(LoadEngine.java:191)
at com.googlecode.objectify.util.ResultCache.now(ResultCache.java:33)
at com.googlecode.objectify.impl.Round$1.nowUncached(Round.java:73)
at com.googlecode.objectify.util.ResultCache.now(ResultCache.java:30)
at com.googlecode.objectify.util.ResultNowFunction.apply(ResultNowFunction.java:20)
at com.googlecode.objectify.util.ResultNowFunction.apply(ResultNowFunction.java:9)
at com.google.common.collect.Iterators$8.transform(Iterators.java:794)
at com.google.common.collect.TransformedIterator.next(TransformedIterator.java:48)
at com.googlecode.objectify.impl.Chunk.next(Chunk.java:27)
at com.googlecode.objectify.impl.Chunk.next(Chunk.java:10)
at com.google.common.collect.Iterators$5.next(Iterators.java:553)
at com.google.common.collect.Iterators$PeekingImpl.peek(Iterators.java:1162)
at com.googlecode.objectify.impl.ChunkingIterator.hasNext(ChunkingIterator.java:52)
at com.google.common.collect.Iterators.addAll(Iterators.java:356)
at com.google.common.collect.Lists.newArrayList(Lists.java:147)
at com.google.common.collect.Lists.newArrayList(Lists.java:129)
at com.googlecode.objectify.util.MakeListResult.translate(MakeListResult.java:21)
at com.googlecode.objectify.util.MakeListResult.translate(MakeListResult.java:11)
at com.googlecode.objectify.util.ResultTranslator.nowUncached(ResultTranslator.java:21)
at com.googlecode.objectify.util.ResultCache.now(ResultCache.java:30)
at com.googlecode.objectify.util.ResultProxy.invoke(ResultProxy.java:32)
at com.sun.proxy.$Proxy23.toArray(Unknown Source)
at java.util.ArrayList.addAll(ArrayList.java:530)
at ch.eaternity.server.DAO.loadCompositeRootsByDateAndKitchenId(DAO.java:1058)
at ch.eaternity.server.services.ReportServiceImpl.loadCompositeRoots(ReportServiceImpl.java:75)
at ch.eaternity.server.services.ReportServiceImpl.loadSupplies(ReportServiceImpl.java:24)
at ch.eaternity.server.reports.GeneralKitchenDataAnalyzer.generateAndSaveConcreteGeneralKitchenData(GeneralKitchenDataAnalyzer.java:45)
at ch.eaternity.server.servlets.ReportGeneratingServlet.kickOffReportDataGeneration(ReportGeneratingServlet.java:75)
at ch.eaternity.server.servlets.ReportGeneratingServlet.doPost(ReportGeneratingServlet.java:46)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
at ch.eaternity.server.NamespaceFilter.doFilter(NamespaceFilter.java:36)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.googlecode.objectify.cache.AsyncCacheFilter.doFilter(AsyncCacheFilter.java:59)
at com.googlecode.objectify.ObjectifyFilter.doFilter(ObjectifyFilter.java:49)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:326)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:438)
at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:445)
at com.google.tracing.CurrentContext.runInContext(CurrentContext.java:220)
at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:309)
at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:301)
at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:442)
at java.lang.Thread.run(Thread.java:724)
Caused by: com.google.appengine.api.memcache.MemcacheServiceException: Memcache putAll: Unknown exception setting 0 keys
at com.google.appengine.api.memcache.MemcacheServiceApiHelper$RpcResponseHandler.handleApiProxyException(MemcacheServiceApiHelper.java:68)
at com.google.appengine.api.memcache.AsyncMemcacheServiceImpl$RpcResponseHandlerForPut.handleApiProxyException(AsyncMemcacheServiceImpl.java:348)
at com.google.appengine.api.memcache.MemcacheServiceApiHelper$1.absorbParentException(MemcacheServiceApiHelper.java:109)
<continued in next message>
W
15:49:20.276
<continued from previous message>
at com.google.appengine.api.utils.FutureWrapper.handleParentException(FutureWrapper.java:51)
at com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:90)
at com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:88)
at com.google.appengine.api.memcache.MemcacheServiceImpl.quietGet(MemcacheServiceImpl.java:26)
at com.google.appengine.api.memcache.MemcacheServiceImpl.putAll(MemcacheServiceImpl.java:115)
... 91 more
我不确定天气与appengine或objectify相关,请参阅此主题进行比较: https://groups.google.com/forum/#!msg/objectify-appengine/GzFmrQNMaI0/1ALIKbEY9agJ
客观化:4.0RC2 Appengine:1.9.9
更新1
升级到Objectify 4.1.3。之后,不再发生异常,但在迭代中的完全相同的点处发生Process moved to a different machine.
警告。为什么它移动到另一台机器?
更新2 与此同时,我达到内存限制的几倍,最后将回溯实例升级到B4,暂时解决了这个问题。
java.lang.RuntimeException: java.lang.OutOfMemoryError: Java heap space
现在错误移动了一点,现在我只得到这个异常大约100次,直到进程被移动到另一台机器。
com.google.appengine.api.memcache.MemcacheServiceException: Memcache getAll: exception getting multiple keys
更新3 有时批处理也会成功运行!我不明白......我会试着弄清楚它什么时候不成功。
任何人都知道问题可能来自哪里?怎么解决? 非常感谢你!
答案 0 :(得分:3)
我没有直接回答你的问题,但我可以对Objectify(和GAE的)行为WRT内存提供一些启示。
Objectify使用memcache作为直读缓存,因此&#34; memcache不可用&#34;出于所有实际目的,与#34;空结果相同&#34; - Objectify将数据从数据存储区中取出。对于这个目的,GAE的memcache API有一个LogAndContinueErrorHandler
- 记录了memecache错误,但忽略了。
不幸的是,谷歌LogAndContinueErrorHandler
有一个错误,即某些类型的内存缓存错误既未被记录也未被忽略。 Objectify得到了一些新的行为(恰当命名的MemcacheServiceRetryProxy
),它重试几次memcache API调用,然后放弃,返回一个空的结果。这就是你所看到的4.0RC2。
一段时间后,Google修改了处理程序,而不是通过更改LogAndContinueErrorHandler
的行为(可能认为某些用户可能依赖于确切的行为),而是弃用该类并添加ConsistentLogAndContinueErrorHandler
行为......更一致Objectify的更高版本转而使用此工具,现在您已经看到了4.1.3的行为 - 减少噪音。
这就是故事的一部分。故事的另一部分是,在某些时候,Objectify对于优化对memcache的调用只是有点过于自以为是,有时会将memcache调用优化为零长度的键列表。 memcache API不是那样的,可能负责Memcache putAll: Unknown exception setting 0 keys
。如果没有操作,更新版本的Objectify会跳过memcache调用。
至于Process moved to a different machine.
,我不知道。它可能是相关的,也可能不是。
答案 1 :(得分:0)
关于在不同实例上向上移动的过程,无论如何都无法控制它。机器可能随时关闭,应用程序引擎会将您的进程转移到另一台机器。您的任务最好是幂等的。