2010-01-04 4 views
0

У меня есть модель пользователя для игровой системы. Необходимо увеличить очки на 100 каждый час.Google App Engine Cron Job Question - Массовое обновление

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

поэтому должен подготовить обработчик, который выполняет запрос GQL для всех объектов? (Это не было бы немного медленно с 500k - 1 млн объектов пользователем?)

например:

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)

что вы думаете, ребята?

ответ

5

, но с другой стороны, почему бы мне просто не учитывать разницу во времени, когда пользователь вступил в систему, а если это N часов, я буду награждать пользователя N * 100 баллов? что должно уменьшить нагрузку на мое приложение.

Да, это гораздо более эффективный подход. Таким образом, вы обновляете очки только один раз за каждый пользовательский вход, вместо того, чтобы обновлять каждую запись пользователя каждый час, что было бы очень дорого.

2

Две мысли по этому поводу:

  • Не беспокойтесь о 500K - записи пользователя 1M. Я не знаю вас или вашу игру, но я был бы очень удивлен, если вы получите более 1K.

  • Если алгоритмический способ распределения точек один раз, а не каждый час, это будет МНОГО предпочтительнее. Определенно сделайте это, тогда. Возникает вопрос: начисляются ли эти точечные приращения, пока пользователь находится в сети? Если это так, вам нужно создать проверку на каждое действие. С другой стороны, если вы все равно это делаете, вам не нужно проверять время входа в систему.

1

Paging through large datasets описываются способы делать вещи, как это - это написано в контексте отображения элементов X на странице по форме, но понятия совпадают.

Вы можете разделить работу, поместив фактические обновления в отложенную задачу.

Однако, как вы предположили, вероятно, более эффективно рассчитывать только это по требованию.

Смежные вопросы