В конфигурации по умолчанию один экземпляр Rails обрабатывает только один запрос за раз, поэтому вам не нужно беспокоиться о проблемах параллелизма на прикладном уровне.
Если у вас запущено несколько экземпляров вашего приложения (что вы, вероятно, делаете / будете выполнять), они все будут отправлять запросы в базу данных, не обсуждая друг друга.Вот почему это обрабатывается на уровне базы данных .MySQL, PostgreSQL и т. Д. Собираются заблокировать строку при записи.
То, как вы справляетесь с этой ситуацией, не идеально для производительности, хотя ваше приложение считывает значение, увеличивает его, а затем записывает.Этот разрыв между чтением и записью позволяет вам пропустить значения.Вы можете избежать этого, передав ответственность за приращение в вашу базу данных (UPDATE hitcounter SET hitcount = hitcount + 1;
).Я полагаю, что ActiveRecord имеет встроенную поддержку, но мне / вам придется ее искать. Обновление: О, да, вы хотите использовать метод increment_counter
для этого. Справочная информация / Документация .
Как только вы обновите свой процесс, увеличьте ответственность за базу данных, и я не буду некоторое время беспокоиться о производительности.Однажды у меня было приложение PHP, которое делало это один раз для каждого запроса, и оно великолепно масштабировалось для меня до 100+ обновлений в секунду (mysqld на той же машине, без постоянных подключений и всегда <10% ЦП). </p>