Google App Engine Cron作业问题 - 批量更新
问题描述:
我有一个游戏系统的用户模型。需要每小时增加100点。Google App Engine Cron作业问题 - 批量更新
# the key_name is the userid in this case
class User(db.Model):
points = db.IntegerProperty(default=0)
因此应该准备一个处理程序,跨所有实体执行GQL查询? (那不是有500K有点慢 - 百万用户实体?)
如:
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 limiy,我可以把它关闭
但是再次说明,为什么我不把用户上次登录时的时间差,如果是N小时,我会奖励用户N * 100分?这应该减少我的应用程序的负载。
如: 类用户(db.Model): lastlogin = db.DateTimeProperty() 点= db.IntegerProperty(默认值为0)
你们觉得呢?
答
但是接下来为什么我不把用户上次登录时的时间差,如果是N小时,我会奖励用户N * 100分?这应该减少我的应用程序的负载。
是的,这是一个更有效的方法。这样,每次用户登录只更新一次点数,而不是每小时更新一次用户记录,这会非常昂贵。在这个
答
两个想法:
不要担心500K - 1M用户条目。我不认识你或你的比赛,但如果你获得超过1K的比赛,我会感到非常惊讶。
如果有一种算法分配一次而不是每小时分配一次,这将会更好。那肯定会那么做。问题出现了:用户在线时,这些点增量是否也增加了?如果是这样,你需要检查每一个动作。另一方面,如果你这样做,那么你不需要在登录时进行检查。
答
Paging through large datasets讨论这样搞技术 - 这是写在表格上显示每页X项目的背景,但其概念是相同的。
您可以通过将实际更新放入延期任务来进一步拆分工作。
但是,正如您所建议的那样,仅根据需要计算该值可能更有效。