Как мне разделить запросы с высокой нагрузкой на процессор в Google App Engine?
-
03-07-2019 - |
Вопрос
Чтобы привести пример такого запроса, для которого я не могу понять, что еще можно сделать:
Приложение представляет собой счет в боулинге / отслеживание статистики.Когда кто-то вводит свои результаты в расширенном режиме, вычисляется ряд статистических данных, а также его оценка.Данные моделируются следующим образом:
Участникам игры нравится имя, пользователь, ссылка на дорожку для боулинга, счет Фрейм - кегли для каждого мяча, логические списки, для которых кегли были сбиты на каждом шаре, информация о траектории мяча (позиция, мишень, куда он фактически попал), счет на момент этого фрейма и т. Д 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)
Решение
Несколько предложений:
- Вы могли бы хранить статистику для кадров как часть той же сущности, что и игра, вместо того, чтобы иметь отдельную сущность для каждого, сохранив ее, например, в виде списка битовых полей (хранящихся в целых числах) для кеглей, стоящих в конце каждого полукадра.Дайте мне знать, если вам нужна более подробная информация о том, как это будет реализовано.
- В противном случае вы можете вычислить некоторые из более взаимосвязанных статистических данных при выборке.Например, подсчет очков на данный момент должен быть простым, если у вас загружена вся игра сразу, что означает, что вы можете избежать необходимости обновлять несколько кадров при каждом запросе.
- Мы можем оказать вам большую помощь, если вы покажете нам свою модель данных.:)