使用ETA的App Engine任务比计划的要晚得多

时间:2013-11-03 05:50:13

标签: google-app-engine scheduled-tasks

我正在使用Google App Engine任务推送队列来安排我希望在预定时间的第二精度内发生的未来任务。

通常情况下,我会在30秒后安排一项任务,这将触发我系统中的状态更改,最后安排另一项未来任务。

我的本​​地开发服务器上的一切正常。

但是,现在我已部署到GAE服务器,我注意到计划任务运行得很晚。我们看到他们在安排完毕后两分钟就跑了。

从任务队列管理控制台,它实际上是针对ETA说的:

ETA: "2013/11/02 22:25:14 0:01:38 ago" 
Creation Time: "2013/11/02 22:24:44 0:02:08 ago"

为什么会这样?

我找不到任何关于ETA安排的任务的期望和精确度的文档。

我正在使用python编程,但我怀疑这有什么不同。\

在python代码中,eta参数记录如下:

eta: A datetime.datetime specifying the absolute time at which the task
        should be executed. Must not be specified if 'countdown' is specified.
        This may be timezone-aware or timezone-naive. If None, defaults to now.

我的队列设置:

queue:    
- name: mgmt
  rate: 30/s

系统处于空载状态,除了应该每30秒左右运行的5个任务外。

更新:

我发现https://code.google.com/p/googleappengine/issues/detail?id=4901这是一个可接受的及时排队功能请求,尽管似乎没有做过任何关于它的事情。它接受这样一个事实,即使用ETA的任务可以延迟很长时间。

我可以使用哪些其他替代机制来安排具有二次精度的触发器?

2 个答案:

答案 0 :(得分:1)

GAE不保证数据中心内部和之间的时钟同步;请参阅UTC Time on Google App engine?进行相关讨论。所以你甚至不能准确地指定绝对时间,即使他们做出(不同的)保证任务在目标时间的某个容忍范围内执行。

如果您确实需要这种精度,可以考虑设置一个持久的GAE“后端”实例,该实例与可信外部时钟同步,并提供任务排队和执行服务。

(旁白:不幸的是,这种方法引入了单点故障,所以要解决这个问题,你可以采取后续步骤并构建这些后端的整个集群......但是那时候你可能会看到其他地方而不是GAE,因为您正在从GAE“自动变速器”模型转向AWS的“手动变速器”模型。)

答案 1 :(得分:1)

我向GAE团队报告了这个问题,我收到了以下回复:

This appears to be an isolation issue. Short version: a high-traffic user is sharing underlying resources and crowding you out. 

Not a very satisfying response, I know. I've corrected this instance, but these things tend to revert over time. 

We have a project in the pipeline that will correct the underlying issue. Deployment is expected in January or February of 2014.

请参阅https://code.google.com/p/googleappengine/issues/detail?id=10228

另见thread:https://code.google.com/p/googleappengine/issues/detail?id=4901

在他们“更正此实例”后,我做了几个小时的测试。对于没有ETA的任务,情况有所改善。但对于使用ETA的任务,我仍然看到至少有一半的人迟到了至少10秒。根据我的要求,这远非可靠

现在我决定在不同的主机上使用我自己的调度服务,直到GAE团队“纠正基础问题”并拥有更可预测的任务调度系统。