2

我正在使用 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 的任务可能会延迟很多分钟。

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

4

2 回答 2

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

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

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

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

于 2013-11-05T10:53:18.563 回答
1

GAE 不保证其数据中心内和数据中心之间的时钟同步;在 Google App 引擎上查看UTC 时间?进行相关讨论。因此,您甚至无法准确指定绝对时间,即使他们做出(不同)保证任务在目标时间的某个容差范围内执行。

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

(旁白:不幸的是,这种方法引入了单点故障,因此要解决这个问题,您可以采取下一步措施并构建这些后端的整个集群......但此时您不妨看看 GAE 以外的其他地方,因为您正在从 GAE 的“自动传输”模型转向 AWS 的“手动传输”模型。)

于 2013-11-03T23:39:25.567 回答