Как разбить запросы с высоким процессором в Google App Engine? - PullRequest
1 голос
/ 30 сентября 2008

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

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

Game - участники, такие как имя, пользователь, ссылка на боулинг, счет Кадр - метки для каждого шара, логические списки, для которых были выбиты булавки на каждом шаре, информация о пути мяча (позиция, цель, куда он фактически пошел), оценка по состоянию на этот кадр и т. Д. 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)

1 Ответ

1 голос
/ 30 сентября 2008

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

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