Как сделать счетчик в транзакции?(Sharding счетчики) - PullRequest
1 голос
/ 17 августа 2011

Я прочитал это , но все еще не могу понять.Я хочу сделать, это книжный магазин.Есть много объектов книги, и каждая книга имеет два счетчика.Один счетчик - записывать количество людей, которым это нравится.Другой - записать количество людей, ненавидящих это.Очевидно, мне нужно увеличить счетчик транзакций в случае, если более 5 человек любят или ненавидят книгу одновременно, верно?

Мои вопросы:
1. Как сделать книгу исчетчик в той же группе сущностей, чтобы я мог использовать их в одних и тех же транзакциях.
2. Как реализовать счетчики шардинга?Я не понимаю, почему ( здесь в третьем примере) нам нужны ShardedCounter, Counter и GeneralCounterShard и как их использовать?
3. Может ли кто-нибудь дать мне пример?Я использую JDO.

Спасибо за любой совет!

Ответы [ 3 ]

2 голосов
/ 17 августа 2011

Вы действительно боитесь, что более 5 человек обновляют счетчики одной и той же книги в одну секунду? это было бы признаком огромного трафика в вашем приложении. Если это так, вам, вероятно, придется решать более важные проблемы, чем тот факт, что счетчик может быть отключен одним или двумя голосами.

Я бы просто включил счетчики в сущность Book:

public class Book {
    // ...
    private int numberOfLovers;
    private int numberOfHaters;
    // ...
}

Сохраняйте это простым и меняйте свой дизайн тогда и только тогда, когда у вас есть проблемы.

1 голос
/ 20 августа 2011

Мы запускаем довольно загруженное приложение для кэширования в AppEngine / Python (то есть более 200 000 запросов в день с пиками до 60 в секунду), и мы должны считать все (например, запрос, байты, байты).

Ваша проблема кажется менее острой; но решение, которое мы нашли, было также более простым, чем те, которые вы упомянули (а также прочитали): мы храним счетчики в Memcache и используем его функцию " incr () " везде, где это необходимо.

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

Затем запрос cron запускается каждую минуту, чтобы получить значения, сохранить их в счетчиках хранилища данных и декремента по найденному значению с вызовом функции Memcache " decr () ".

Таким образом, приращения, происходящие между получением и уменьшением, не теряются и будут обрабатываться в следующую минуту.

Конечно, перебои с Memcache вызывают беспокойство, но они случаются не часто.

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

Группа сущностей полезна, если вам нужно обновить несколько элементов в одной транзакции.Например, уменьшить значение от одного счетчика объекта и увеличить на другое.И нужно быть уверенным, что или обе операции выполнены, или ни одна из них.

Поскольку вам нужно просто увеличить одно значение (или два значения из той же сущности), вам не нужны никакие группы,

Просто обновите свою сущность в транзакции.В транзакции GAE используется оптимистическая блокировка, что означает следующие шаги:

  1. Вы получаете текущее значение из дБ (по ключу, например)
  2. Установка значений для любых полей
  3. Поместите обновленную сущность

И, сохраняя сущность в db, gae проверит, что эта сущность не обновлялась с момента вашего первого чтения (см. Шаг 1).Если это все еще то же самое - это сохраняет ваше новое значение.Если это изменилось - это исключение.Вот и все.

Если у вас есть исключение - вы можете перезагрузить сущность и попробовать обновить заново.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...