后端“进程移动到另一台计算机”并因错误500而失败

时间:2014-07-20 22:25:19

标签: google-app-engine

我有一个大约需要五分钟才能完成的过程。它在后端实例中每两个小时运行一次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基础架构问题,还是应用程序代码中存在可能导致该问题的内容?

3 个答案:

答案 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)

我也在后端模块中遇到了“进程移动到另一台机器”的问题。

问题背景如下:

  1. 从一个KIND
  2. 获取查询结果
  3. 迭代查询结果中的每个实体,我将执行一些任务并将新实体写入不同的KIND
  4. 在迭代的一半中发生“移动到另一台机器的过程”
  5. 经过一些实验,我发现这是由于“在一个请求中编写的事务太多”。当查询结果的大小很小时,一切都很好,但是当它变大时会引起问题。

    我采用的最终解决方案是使用Task Queue,应该为实体完成工作,将其视为一项任务并放入PushQueue。所以问题就消失了。

    希望这会有所帮助:)