Google App Engine Cron工作问题 - 批量更新

时间:2010-01-04 11:05:49

标签: google-app-engine

我有一个游戏系统的用户模型。需要每小时增加100点。

# the key_name is the userid in this case
class User(db.Model):
  points = db.IntegerProperty(default=0)

那么应该准备一个跨所有实体进行GQL查询的处理程序吗? (500k - 100万用户实体会不会有点慢?)

例如:

users = User.all() # if i'm not mistaken, only 1000 queries can be done.
for user in users:
  user.points += 100
  db.put(user)

我想使用任务队列,并使用分片计数器来克服1000分,我可以将其拉下来

但话又说回来,为什么我不采取用户上次登录的时间差,如果是N个小时,我会给用户N * 100分?这应该减少我的应用程序的负担。

例如:     class User(db.Model):       lastlogin = db.DateTimeProperty()       points = db.IntegerProperty(默认= 0)

你觉得怎么样?

3 个答案:

答案 0 :(得分:5)

  

但话又说回来,为什么我不采取用户上次登录的时间差,如果是N个小时,我会给用户N * 100分?这应该减少我的应用程序的负担。

是的,这是一种更有效的方法。这样,您每次登录时只更新一次积分,而不是每小时更新一次用户记录,这将非常昂贵。

答案 1 :(得分:2)

对此有两点想法:

  • 不要担心500K - 1M用户条目。我不认识你或你的游戏,但如果你的游戏超过1K,我会非常惊讶。

  • 如果有一种算法来分配点数而不是每小时一次,那么这将是更好的选择。那肯定是那样做的。问题出现了:当用户在线时,这些点数增量是否也会产生?如果是这样,您需要对每个操作进行检查。另一方面,如果你这样做,那么你在登录时不需要检查。

答案 2 :(得分:1)

Paging through large datasets讨论了这样做的技巧 - 它是在表单上每页显示X项的上下文中编写的,但概念是相同的。

您可以通过将实际更新放在延期任务中来进一步拆分工作。

但是,正如您所建议的那样,仅根据需要进行计算可能更有效。