我正在使用 Google App Engine 任务推送队列来安排我希望在计划时间的秒精度内发生的 future 任务。
通常我会在 30 秒后安排一个任务,这会触发系统状态的变化,最后安排另一个 future 的任务。
在我的本地开发服务器上一切正常。
但是,现在我已经部署到 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
系统没有任何负载,除了 5 个任务应该每 30 秒左右运行一次。
更新:
我找到了https://code.google.com/p/googleappengine/issues/detail?id=4901这是一个已接受的及时队列功能请求,尽管似乎没有采取任何措施。它接受这样一个事实:预计到达时间的任务可能会延迟运行很多分钟。
我可以使用哪些其他替代机制来安排第二精度的触发器?
最佳答案
GAE 不保证其数据中心内部和数据中心之间的时钟同步;请参阅UTC Time on Google App engine?进行相关讨论。因此,您甚至无法准确指定绝对时间,即使他们(不同)保证任务在目标时间的某个容差范围内执行。
如果您确实需要这种精度,您可以考虑设置一个持久的 GAE“后端”实例,使其与受信任的外部时钟同步,并提供任务排队和执行服务。
(旁白:不幸的是,这种方法引入了单点故障,因此要解决这个问题,您只需采取后续步骤并构建这些后端的整个集群......但在这一点上,您不妨看看其他地方,而不是GAE,因为您正在从 GAE“自动传输”模型转向 AWS 的“手动传输”模型。)
关于google-app-engine - 具有 ETA 的 App Engine 任务的触发时间比计划晚得多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19750221/