我有一个大约需要五分钟才能完成的过程。它在后端实例中每两个小时运行一次cron作业。
最近这个过程已经开始失败;不是每次都是一天几次。首先发生的事情是memcache开始抛出异常:
04:21:13.640 com.google.appengine.api.memcache.LogAndContinueErrorHandler handleServiceError: Service error in memcache
com.google.appengine.api.memcache.MemcacheServiceException: Memcache get: exception getting 1 key (ItemFollowableCompleted:RegionUS:P8XD:0)
at com.google.appengine.api.memcache.MemcacheServiceApiHelper$RpcResponseHandler.handleApiProxyException(MemcacheServiceApiHelper.java:68)
at com.google.appengine.api.memcache.MemcacheServiceApiHelper$1.absorbParentException(MemcacheServiceApiHelper.java:109)
这些都不是致命的例外,但几秒钟之后,该过程在没有警告或关机消息的情况下终止。日志显示
04:21:30.591 Process moved to a different machine.
,错误500。
这是与memcache相关的Google基础架构问题,还是应用程序代码中存在可能导致该问题的内容?
答案 0 :(得分:1)
不,这不是Google基础架构中的错误。您的流程预计会在需要时移动到实例中(维护,来自您身边的更多需求,......),并且您无法阻止它。
尽管如此,您还是可以采取一些措施来减轻应用中可能产生的任何影响。
查看[1],了解有关如何在关闭实例时跟踪待处理作业的一些建议,并查看后台线程。
我猜你正在使用Python,如果没有,请找你的相应语言。
[1] https://developers.google.com/appengine/docs/python/backends/#Python_Backend_states
答案 1 :(得分:1)
当我使用ndb.putmulti()加载数据时,我遇到了同样的问题。我试了几件事 1.增加我的后端机器尺寸,我转移到B4_1G 2.在ndb.putmulti()之间休眠(每200个实体2分钟) 3.专用内存(1G)
1和2不是很有帮助,3似乎有所帮助。
我认为对影响memcache的ndb数据存储区的快速更新是我的主要原因。除了支付专门的memcache之外,我找不到任何其他方式。
答案 2 :(得分:1)
我也在后端模块中遇到了“进程移动到另一台机器”的问题。
问题背景如下:
经过一些实验,我发现这是由于“在一个请求中编写的事务太多”。当查询结果的大小很小时,一切都很好,但是当它变大时会引起问题。
我采用的最终解决方案是使用Task Queue
,应该为实体完成工作,将其视为一项任务并放入PushQueue
。所以问题就消失了。
希望这会有所帮助:)