为什么任务名称包含“now / 30”?

时间:2010-06-07 19:54:56

标签: google-app-engine task-queue

在“使用Google App Engine的数据管道”中的视频/ PDF中,Brett将“now / 30”放入任务名称,并指出他稍后会解释原因,但不知怎的,他从未这样做过。 :)
http://www.youtube.com/watch?v=zSDC_TU7rtc#t=41m35

task_name = '%s-%d-%d' % (sum_name, int(now / 30), index)

你对这个原因有什么看法吗?它是否与7天无法重复使用任务名称有关?

Link to the session page

1 个答案:

答案 0 :(得分:3)

Brett Slatkin's own explanation

[布雷特]
嘿所有,

任务名称的int(time.time()/ 30)部分是为了防止队列停顿。当memcache被驱逐时,工作索引计数器将重置为零。这意味着新的fork-join工作项可能会插入与已插入的任务名称相同的任务。通过在任务名称中包含~30秒的时间窗口,我们确保此问题只能持续约30秒。这也是您在看到TombstonedTaskError异常时引发异常的原因。

最糟糕的情况是,如果时钟不稳定,则运行两个任务来执行扇入工作而不仅仅是一个,这在许多情况下是可接受的权衡,并且在使用任务队列API时是一个基本的可能性。这可以使用鸽子洞确认实体来缓解,就像我在物化视图示例中使用的那样。

希望有所帮助,
[/布雷特]