Счетчики Google App Engine - PullRequest
       6

Счетчики Google App Engine

2 голосов
/ 03 октября 2010

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

counter = DBCounter.all().fetch(1)
dbc = DBCounter(totalTopics=counter[0].totalTopics+1)
dbc.put()

Но мне это кажется довольно небрежным.Есть мысли о лучшем способе сделать это?

Ответы [ 2 ]

5 голосов
/ 03 октября 2010

Есть несколько проблем с вашим подходом:

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

Вот несколько альтернативных подходов (от наименее точных [и самых быстрых] до самых точных [и самых медленных]):

  • Если вам нужен только приблизительный подсчет количества объектов определенного вида в хранилище данных, вы можете использовать Stats API . Однако полученные вами данные не обновляются постоянно.
  • Если вам нужна дополнительная детализация, но все в порядке с небольшой вероятностью периодического занижения счета, вы можете использовать счетчик с улучшенной памятью. Есть несколько хороших реализаций, обсуждаемых в этом вопросе . В частности, см. Код в комментариях к этому рецепту .
  • Если вы действительно хотите избежать недоучета, вам следует рассмотреть счетчик shaded datastore *1029*. Это устранит проблему разногласий сверху.
4 голосов
/ 03 октября 2010

Если вам необходимо сохранить масштабируемость при подсчете, вам следует ознакомиться со статьей Джо Грегорио о счетчиках шардинга и реализацией идеи DocSavage идеи.также есть информация о масштабируемых счетчиках без сегментов, см. этот , который использует очереди задач и указывает на предыдущую статью об использовании заданий cron.

...