rails 3 & activerecord: нужно ли предпринимать особые меры предосторожности при блокировке записи, чтобы обновить поле счетчика? - PullRequest
1 голос
/ 11 июня 2011

Каждый раз, когда отображается профиль пользователя, мы обновляем счетчик целых чисел в таблице Users.

Я начал думать о ситуациях с высокой степенью параллелизма и подумал, что произойдет, если группа людей одновременно зайдет на страницу профиля пользователя: rails / activerecord волшебным образом обрабатывает блокировку записей и семафор для меня?

Или моему приложению нужно явно вызывать какой-то механизм, чтобы избежать пропущенных событий обновления при одновременных вызовах моего метода обновления?

def profile_was_hit
  self.update_attributes :hitcounter =>  self.hitcount + 1
end

И в таком случае, когда я должен использовать что-то вроде Users.increment_counter (: hit counter, self.id) вместо этого?

1 Ответ

4 голосов
/ 11 июня 2011

В конфигурации по умолчанию один экземпляр Rails обрабатывает только один запрос за раз, поэтому вам не нужно беспокоиться о проблемах параллелизма на прикладном уровне.

Если у вас запущено несколько экземпляров вашего приложения (что вы, вероятно, делаете / будете выполнять), они все будут отправлять запросы в базу данных, не обсуждая друг друга.Вот почему это обрабатывается на уровне базы данных .MySQL, PostgreSQL и т. Д. Собираются заблокировать строку при записи.

То, как вы справляетесь с этой ситуацией, не идеально для производительности, хотя ваше приложение считывает значение, увеличивает его, а затем записывает.Этот разрыв между чтением и записью позволяет вам пропустить значения.Вы можете избежать этого, передав ответственность за приращение в вашу базу данных (UPDATE hitcounter SET hitcount = hitcount + 1;).Я полагаю, что ActiveRecord имеет встроенную поддержку, но мне / вам придется ее искать. Обновление: О, да, вы хотите использовать метод increment_counter для этого. Справочная информация / Документация .

Как только вы обновите свой процесс, увеличьте ответственность за базу данных, и я не буду некоторое время беспокоиться о производительности.Однажды у меня было приложение PHP, которое делало это один раз для каждого запроса, и оно великолепно масштабировалось для меня до 100+ обновлений в секунду (mysqld на той же машине, без постоянных подключений и всегда <10% ЦП). </p>

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