У меня есть существующая игра для 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) для повышения производительности, но меня больше интересует исправление ошибок / и т. Д.