Оценка игрового движка приложения / дизайн таблицы лидеров - как сделать лучше? - PullRequest
1 голос
/ 22 ноября 2011

У меня есть существующая игра для Android, в которой GAE используется для подсчета очков и формирования списков лидеров.Тем не менее, я вижу все виды ужасных странностей даже с 10 одновременными пользователями.

Каждая игра длится 3 минуты.Синхронизация обеспечивается синхронизированной записью CRON, которая запускает задачу.

Шаг 0 :

  • клиенты отправляют баллы
  • GAE проверяет пользователясуществует и создает временный объект модели, содержащий имя пользователя + оценка / etc
  • GAE порождает задачу по обновлению статистики пользователя (сколько игр было сыграно, общая оценка / etc)

Шаг 1 (отправить +5 секунд) ... запущен CRON:

  • собрать все оценки временных пользователей
  • ранжировать их и поместить в хранилище для этой игры.
  • обновить указатель модели «предыдущая игра», чтобы указать на последнюю «предыдущую игру»
  • обновить «текущую игру», чтобы указать на следующую доступную игровую доску

Шаг 2 : (отправить + 10 секунд):

  • рейтинговые оценки, доступные для клиентов.
  • клиенты начинают получать оценки (выбрать «последнюю игру» «указатель»)ключ, разыскивать и подавать результаты)

Шаг 3 : (отправить + 20 секунд):

  • clients начинает тянуть следующую игру

Шаг 4 : (отправить + 25 секунд):

  • новая игра начинается на следующие 2m30secs

Проблемы, с которыми я сталкиваюсь:

GAE случайным образом не сохраняет некоторые / все представленные результаты или не может получить некоторые / все результаты для расчета всех результатов игры.

GAE иногда обслуживает одну и ту же плату дважды (т. Е. Синхронизированный CRON не запускался).

GAE (wtf?) Никогда не регистрирует никаких ошибок.Это похоже на то, что операция просто не произошла, вместо случайной ошибки.Вероятность ошибки составляет около 2-5%, но при 480 играх в день это МНОГО ошибок ... которые замечают мои пользователи!

Если у кого-то есть предложения по улучшениюдля архитектора вещей, или некоторые комментарии, это будет с благодарностью!Я знаю, что могу улучшить ситуацию, используя memcache для результатов и предварительно преобразовав результаты в поток (потому что memcache использует pickle) для повышения производительности, но меня больше интересует исправление ошибок / и т. Д.

1 Ответ

1 голос
/ 06 февраля 2014

Хитрость в этом заключается в следующем:

  1. Кэшировать запросы (например, для игрового поля / результатов) в локальном плеере и предварительно их обрабатывать
  2. Использовать Backend с асинхронными вытягиваниями длякеширующий узел node.js, который получает оценки для получения данных списка лидеров
  3. Backend создает таблицы лидеров, а затем отправляет их в хранилище данных и memcache
  4. Backend полагается на порожденный поток, который исправлен по протоколу NTP, и выполняется в lockstepсо временем с помощью sleep ()
  5. Задание cron контролирует бэкэнд и перезапустит его в случае сбоя (поскольку GAE не перезапустит его из-за ошибок инфраструктуры)

Пробовалэто не сработало:

  1. Задание Cron для сохранения времени (не всегда запускается и не запускается вовремя)
  2. Несколько бэкэндов, принимающих результаты вместо node.js boxen
  3. CloudSQL (проблемы с пропускной способностью)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...