Как мне разделить запросы с высокой нагрузкой на процессор в Google App Engine?

StackOverflow https://stackoverflow.com/questions/153732

Вопрос

Чтобы привести пример такого запроса, для которого я не могу понять, что еще можно сделать:

Приложение представляет собой счет в боулинге / отслеживание статистики.Когда кто-то вводит свои результаты в расширенном режиме, вычисляется ряд статистических данных, а также его оценка.Данные моделируются следующим образом:

Участникам игры нравится имя, пользователь, ссылка на дорожку для боулинга, счет Фрейм - кегли для каждого мяча, логические списки, для которых кегли были сбиты на каждом шаре, информация о траектории мяча (позиция, мишень, куда он фактически попал), счет на момент этого фрейма и т. Д GameStats - хранит рассчитанную статистику для всей игры, которая при необходимости может быть объединена с другой игровой статистикой для отображения статистики по группам игр.

Пример применения этой информации на практике можно найти здесь.

Когда игра завершена и фрейм обновлен, я должен обновить игру, фрейм, каждый фрейм после него и, возможно, некоторые до него (чтобы убедиться, что их оценки верны), а также статистику.Эта операция всегда помечает монитор процессора.Даже если игра не завершена и статистику подсчитывать не нужно, оценки и тому подобное необходимо обновлять, чтобы показывать пользователю прогресс в режиме реального времени, и поэтому они также помечаются.Среднее процессорное время для этого обработчика составляет более 7000 микроциклов, и он даже не отображает представление.Большинство людей играют от 3 до 4 игр в серии - если они вводят свои результаты в режиме реального времени, на дорожках, это примерно 1 запрос каждые 2-4 минуты, но если они все это запишут и введут позже, то таких запросов будет сделано 30-40 подряд.


В соответствии с запросом, модель данных для важных классов:

class Stats(db.Model):
  version = db.IntegerProperty(default=1)
  first_balls=db.IntegerProperty(default=0)
  pocket_tracked=db.IntegerProperty(default=0)
  pocket=db.IntegerProperty(default=0)
  strike=db.IntegerProperty(default=0)
  carry=db.IntegerProperty(default=0)
  double=db.IntegerProperty(default=0)
  double_tries=db.IntegerProperty(default=0)
  target_hit=db.IntegerProperty(default=0)
  target_missed_left=db.IntegerProperty(default=0)
  target_missed_right=db.IntegerProperty(default=0)
  target_missed=db.FloatProperty(default=0.0)
  first_count=db.IntegerProperty(default=0)
  first_count_miss=db.IntegerProperty(default=0)

  second_balls=db.IntegerProperty(default=0)
  spare=db.IntegerProperty(default=0)
  single=db.IntegerProperty(default=0)
  single_made=db.IntegerProperty(default=0)
  multi=db.IntegerProperty(default=0)
  multi_made=db.IntegerProperty(default=0)
  split=db.IntegerProperty(default=0)
  split_made=db.IntegerProperty(default=0)

class Game(db.Model):
  version = db.IntegerProperty(default=3)
  user = db.UserProperty(required=True)
  series = db.ReferenceProperty(Series)
  score = db.IntegerProperty()
  game_number = db.IntegerProperty()
  pair = db.StringProperty()
  notes = db.TextProperty()
  simple_entry_mode = db.BooleanProperty(default=False)
  stats = db.ReferenceProperty(Stats)
  complete = db.BooleanProperty(default=False)

class Frame(db.Model):
  version = db.IntegerProperty(default=1)
  user = db.UserProperty()
  game = db.ReferenceProperty(Game, required=True)
  frame_number = db.IntegerProperty(required=True)
  first_count = db.IntegerProperty(required=True)
  second_count = db.IntegerProperty()
  total_count = db.IntegerProperty()
  score = db.IntegerProperty()
  ball = db.ReferenceProperty(Ball)
  stance = db.FloatProperty()
  target = db.FloatProperty()
  actual = db.FloatProperty()
  slide = db.FloatProperty()
  breakpoint = db.FloatProperty()
  pocket = db.BooleanProperty()
  pocket_type = db.StringProperty()
  notes = db.TextProperty()
  first_pinfall = db.ListProperty(bool)
  second_pinfall = db.ListProperty(bool)
  split = db.BooleanProperty(default=False)
Это было полезно?

Решение

Несколько предложений:

  • Вы могли бы хранить статистику для кадров как часть той же сущности, что и игра, вместо того, чтобы иметь отдельную сущность для каждого, сохранив ее, например, в виде списка битовых полей (хранящихся в целых числах) для кеглей, стоящих в конце каждого полукадра.Дайте мне знать, если вам нужна более подробная информация о том, как это будет реализовано.
  • В противном случае вы можете вычислить некоторые из более взаимосвязанных статистических данных при выборке.Например, подсчет очков на данный момент должен быть простым, если у вас загружена вся игра сразу, что означает, что вы можете избежать необходимости обновлять несколько кадров при каждом запросе.
  • Мы можем оказать вам большую помощь, если вы покажете нам свою модель данных.:)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top