尽管已经成功,但由于 "instance unavailable",GAE 延迟任务重试
GAE deferred task retried due to "instance unavailable" despite having already succeeded
在我们的 GAE 应用程序中,由于使用相同名称多次提交命名任务,我们偶尔会在延迟任务中看到 TombstonedTaskError 错误。这些任务似乎偶尔会被 GAE 自动重新提交,尽管延迟任务的第一次执行成功了。
例子见this log screenshot:任务"refresh_stock_status-1451012400-GNeg-completion-poll-2"于12月25日上午提交,12-2507:35:05完成。然后,出于某种原因,GAE ("X-Appengine-Taskretrycount:1") 在 07:35:18 自动重试了该任务,指定的原因是 "X-Appengine-Taskretryreason:Instance Unavailable"。显然,一个实例(id 以“...2976”结尾)可用,任务已经完成。为什么要这样重试?可以做些什么来防止它?虽然很少见,但这些错误仍然具有误导性,并且在监控我们的应用程序期间检查它们需要时间。
我在网上发现的唯一类似情况是在 https://groups.google.com/forum/#!topic/google-appengine/0JWCp3OGnMI。但是,除了摆弄实例缩放配置(这可能会减少错误发生率)之外,没有提供任何解决方案,在我们的例子中,这会产生太多副作用。
在与 Google 支持人员联系后,发现原因是延迟任务很少会被 GAE 执行多次。这意味着必须实现任务,以便它们可以安全地多次执行而不会出现任何错误,而我们并非如此(因为我们假设任务只会执行一次)。
在我们的 GAE 应用程序中,由于使用相同名称多次提交命名任务,我们偶尔会在延迟任务中看到 TombstonedTaskError 错误。这些任务似乎偶尔会被 GAE 自动重新提交,尽管延迟任务的第一次执行成功了。
例子见this log screenshot:任务"refresh_stock_status-1451012400-GNeg-completion-poll-2"于12月25日上午提交,12-2507:35:05完成。然后,出于某种原因,GAE ("X-Appengine-Taskretrycount:1") 在 07:35:18 自动重试了该任务,指定的原因是 "X-Appengine-Taskretryreason:Instance Unavailable"。显然,一个实例(id 以“...2976”结尾)可用,任务已经完成。为什么要这样重试?可以做些什么来防止它?虽然很少见,但这些错误仍然具有误导性,并且在监控我们的应用程序期间检查它们需要时间。
我在网上发现的唯一类似情况是在 https://groups.google.com/forum/#!topic/google-appengine/0JWCp3OGnMI。但是,除了摆弄实例缩放配置(这可能会减少错误发生率)之外,没有提供任何解决方案,在我们的例子中,这会产生太多副作用。
在与 Google 支持人员联系后,发现原因是延迟任务很少会被 GAE 执行多次。这意味着必须实现任务,以便它们可以安全地多次执行而不会出现任何错误,而我们并非如此(因为我们假设任务只会执行一次)。