谷歌应用引擎 - 关于cron任务的设计考虑因素

时间:2009-05-02 13:54:04

标签: python database google-app-engine cron

我正在使用谷歌应用引擎开发软件。

我对以下问题的优化设计有一些考虑:我需要定期创建和保存某些实体的快照。

在传统的关系数据库世界中,我将创建db作业,这将插入新的摘要记录。

例如,作业会将每个活动用户的记录插入到“userrank”表中,例如每小时一次。

我想知道在谷歌应用引擎中实现这一目标的最佳方法是什么。我知道有Cron服务,但它是否允许我们执行插入/更新数千条记录的作业?

3 个答案:

答案 0 :(得分:3)

我认为你会发现,无论你的框架是什么,每小时快照每个用户的状态都不会很好。更普通的环境会让你有更长时间的运行任务来掩盖这一点,但你仍然会达到每小时拍摄每个用户数据的快照是不切实际的。

我的建议是这样的:添加一个'last snapshot'字段,并继承你模型的put()函数(假设你正在使用Python;在Java中也是如此,但我不知道语法),这样无论何时更新记录,它都会检查自上次快照以来是否超过一小时,如果是,则创建并写入快照记录。

为了防止并发更新创建两个相同的快照,您需要为快照提供从拍摄快照的时间派生的密钥名称。这样,如果两个并发更新尝试编写快照,则会无害地覆盖另一个。

要获取给定小时的快照,只需查询比请求的时间段更新的最旧快照。作为一个额外的好处,因为非活动记录没有快照,所以你也节省了很多空间。

答案 1 :(得分:2)

您是否考虑过使用remote api?这样,您就可以获得数据存储区的shell并避免超时。他们在该链接中演示的Mapper类非常有用,我已成功使用它对~1500个对象进行批处理操作。

那就是说,cron应该也能正常工作。您确实对每个请求的时间有限制,因此您不能一次性地完成所有请求,但您可以使用重定向来循环所需数量的用户,一次处理一个用户。如果您需要有关此方法的帮助,那么在某些文档中应该有这样的示例。

答案 2 :(得分:0)

我将使用Cron作业和循环网址获取方法的组合,详细信息如下:http://stage.vambenepe.com/archives/549。通过这种方式,您可以捕获超时并开始另一个请求。

总结一下这篇文章,cron作业调用你的初始进程,你捕获超时错误并再次调用进程,屏蔽为第二个url。您必须在两个URL之间执行ping操作,以防止应用引擎认为您处于意外循环中。您还需要注意不要无限循环。确保更新循环有一个结束状态,因为如果它从未结束,这会很快超过您的配额。