Google App Engine - cron任务的设计考虑事项

1 投票
3 回答
1486 浏览
提问于 2025-04-15 11:21

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

我有一些关于如何设计的想法,主要是关于一个问题:我需要定期创建和保存一些实体的快照。

在传统的关系型数据库中,我会创建一些数据库任务,定期插入新的汇总记录。

举个例子,我会设置一个任务,每小时为每个活跃用户在“userrank”表中插入一条记录,记录他的当前得分。

我想知道在谷歌应用引擎中,最好的方法是什么来实现这个功能。我知道有一个Cron服务,但它是否允许我们执行任务来插入或更新成千上万的记录呢?

3 个回答

0

我会使用定时任务和一种循环获取网址的方法,具体细节可以在这里找到:http://stage.vambenepe.com/archives/549。这样你就可以处理超时问题,并开始另一个请求。

简单来说,这篇文章的意思是,定时任务会启动你的初始过程,当你捕捉到超时错误时,就会再次调用这个过程,但这次用的是另一个网址。你需要在两个网址之间来回请求,以防止应用引擎误以为你在无意中进入了一个循环。同时,你也要小心不要无限循环。确保你的更新循环有一个结束状态,因为如果它永远不结束,你很快就会超出配额。

3

我觉得每小时记录每个用户的状态,这种做法不管用什么框架都不太能扩展。一般的环境可能会让你觉得没问题,因为可以处理一些长时间运行的任务,但最终你还是会发现,每小时记录每个用户的数据是不现实的。

我建议你这样做:添加一个“最后快照”字段,然后对你的模型的put()函数进行一些修改(假设你在用Python;在Java中也可以做到,但我不太懂那里的语法),这样每次更新记录时,就检查一下自上次快照以来是否已经过了一个小时。如果是,就创建并写入一个新的快照记录。

为了防止同时更新导致两个相同的快照,你可以给快照起一个名字,这个名字可以根据快照生成的时间来定。这样,如果两个更新同时想写快照,其中一个就会覆盖另一个,但不会出问题。

要获取某个小时的快照,只需查询比请求的时间段更新的最旧快照就可以了。额外的好处是,由于不活跃的记录不会被快照,你也节省了很多存储空间。

2

你有没有考虑过使用远程API呢?这样你就可以直接连接到你的数据存储,避免超时的问题。那个链接里展示的Mapper类非常有用,我用它成功地对大约1500个对象进行了批量操作。

不过,定时任务(cron)也应该能正常工作。每个请求的时间是有限制的,所以你不能一次性处理所有请求,但你可以通过重定向来循环处理多个用户,每次处理一个用户。如果你需要这种方法的帮助,文档里应该有相关的例子。

撰写回答