Почему экземпляр модели не будет найден при фиксации счетчика с использованием счетчиков обратной записи или сегментированных счетчиков в App Engine? - PullRequest
2 голосов
/ 30 августа 2011

Я работаю над счетчиком для приложения App Engine и следую приведенному здесь примеру http://blog.notdot.net/2010/04/High-concurrency-counters-without-sharding

У меня проблемы с пониманием необходимости в следующих строках:

counter = cls.get_by_key_name(name)
if not counter:
  counter = cls()

Похоже, что для экземпляра был запрошен инкремент, и затем, когда этот инкремент должен был быть применен к хранилищу данных, экземпляр не был найден и был заменен новым.

Тот же шаблон используется в примере с счетчиками шардинга code.google.com/appengine/articles/sharding_counters.html

counter = SimpleCounterShard.get_by_key_name(shard_name)
    if counter is None:
        counter = SimpleCounterShard(key_name=shard_name)

В этом случае имя_ключа согласуется между тем, которое не было найдено, и тем, которое создано, поэтому, когда в конечном счете вызывается counter.put (), кажется, что новый перезапишет не найденный.

Мое использование похоже на этот пример, который основан на первом примере выше: https://github.com/pamelafox/ragetube/blob/master/models.py

Я читаю строку 66 как «песня была просмотрена, и пришло время обновить ее количество просмотров. Выберите песню, но если вы не можете, создайте новую песню и дайте ей это количество» , Это не может быть правдой.

Почему get_by_key_name () не может вернуть запись? Есть ли какое-то поведение по умолчанию, которое заставляет работать первый пример (т. Е. Следует ли указывать какое-либо имя ключа)? В какой ситуации я могу оказаться, если просто вернусь из функции, если экземпляр не найден?

1 Ответ

0 голосов
/ 31 августа 2011

Первый должен быть

counter = cls(key_name=name)
...