1

我正在使用 Google App Engine 开发软件。

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

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

例如,一个工作会为每个活动用户插入一条记录,其中包含他当前的分数到“userrank”表中,比如每小时。

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

4

3 回答 3

3

我想你会发现,无论你的框架是什么,每小时对每个用户的状态进行快照都不能很好地扩展。更普通的环境会通过让您运行更长的任务来掩盖这一点,但您仍然会达到每小时为每个用户的数据拍摄快照的地步。

我的建议是:添加一个“最后一个快照”字段,并将模型的 put() 函数子类化(假设您使用的是 Python;在 Java 中也是如此,但我不知道语法),例如每当您更新记录时,它都会检查自上次快照以来是否超过一个小时,如果是,则创建并写入快照记录。

为了防止并发更新创建两个相同的快照,您需要为快照指定一个从拍摄快照的时间派生的键名。这样,如果两个并发更新尝试写入快照,一个将无害地覆盖另一个。

要获取给定小时的快照,只需查询比请求时间段更新的最旧快照。作为一个额外的好处,由于不活动的记录没有被快照,你也节省了大量的空间。

于 2009-05-02T16:17:30.970 回答
2

您是否考虑过使用远程 API?通过这种方式,您可以获得数据存储的 shell 并避免超时。他们在该链接中演示的 Mapper 类非常有用,我已经成功地使用它对大约 1500 个对象进行批处理操作。

也就是说,cron 也应该可以正常工作。您确实对每个单独请求的时间有限制,因此您不能一次全部浏览它们,但是您可以使用重定向来循环任意数量的用户,一次处理一个用户。如果您需要有关此方法的帮助,文档中应该有一个示例。

于 2009-05-02T14:23:21.200 回答
0

我会结合使用 Cron 作业和此处详述的循环 url 获取方法:http: //stage.vambenepe.com/archives/549。通过这种方式,您可以捕获超时并开始另一个请求。

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

于 2009-11-18T19:35:02.840 回答