Как сохранить упорядоченный список в хранилище данных App Engine, чтобы каждый объект знал свою позицию в списке? - PullRequest
3 голосов
/ 10 февраля 2011

У меня есть рейтинг людей, основанный на заработанных ими баллах.Мне нужно сообщить каждому участнику их позицию в игре, например, Джон (1) - 170 баллов, Мэри (2) - 160 баллов, Сара (3) - 110 баллов

Итак, Джон первый, Мэрисекунды, а Сара третья.Теперь, если Мэри выиграет еще 20 очков, она будет первой, а Джон будет вторым.

Я пытаюсь избежать запуска задачи на cron, чтобы составить список и пересчитать позицию каждого.

Моя первая попытка состояла в том, чтобы сохранить отдельный набор сущностей (PersonRank), чтобы я не столкнулся с проблемами транзакций, у этого ранга было бы то же самое имя ключа, чтобы я мог db.get () по ключу.Эта сущность будет иметь рассчитанный ранг человека, поэтому, когда Человек получает очки, я должен проверить, имеет ли следующий Человек на линии меньше очков, чем я, и поменяться местами со мной, так что это правда.Проблема в том, что Сара, например, могла набрать 100 очков, и теперь она номер один.В предыдущем алгоритме мне пришлось бы «ходить» среди множества сущностей, что означает, что большое количество DataStore получает и помещает (обновляет каждую задействованную сущность на новую позицию).

Моя следующая догадка может бытькакой-то связанный список с ReferenceProperties, возможно, использующий имена ключей для обозначения позиции.

Любые подсказки о том, как реализовать это?

Ответы [ 2 ]

0 голосов
/ 12 января 2015

Как вы ответили 3 года назад, Google реализовал это решение, но они сделали это исключительно для Python.Существует неофициальное решение для Java, кто-то переписал решение Python и решил поделиться им: http://toolongdidntread.com/google-app-engine/using-googles-datastore-to-implement-a-ranked-scoreboard/

Люди говорят, что оно работает нормально, хотя я еще не использовал его.Я мог бы решить использовать это в следующие несколько месяцев, чтобы я мог написать больше об этом тогда.Помните, что решения на Java и Python могут обрабатывать только 3 запроса в секунду (!).

Подробнее читайте здесь: https://cloud.google.com/developers/articles/fast-and-reliable-ranking-in-datastore/

По сути, это говорит о том, что Google обновил код, чтобы он могобрабатывать 300 запросов в секунду, и они сказали, что если вы купите их поддержку премиум-уровня, они могут помочь вам в этом, но они не поделятся готовым решением с простыми смертными.Кроме того, весь код и ссылки написаны на Python, но это довольно очевидно.

Нет лучшего решения, чем упомянутое здесь, по крайней мере, я не знаю ни одного.

0 голосов
/ 10 февраля 2011

Гораздо сложнее, чем я, но, надеюсь, некоторые ребята из Google уже внедрили это решение - http://googleappengine.blogspot.com/2009/01/google-code-jams-ranking-library.html

...