Как сделать обновления ActiveRecord потокобезопасными в Rails?

У меня есть очередь заданий Resque. Каждое задание имеет пакет событий для обработки. Рабочий обработает задания и посчитает количество событий, произошедших за каждую минуту. Он использует ActiveRecord, чтобы получить "datapoint" на эту минуту, добавить количество событий к нему и сохранить.

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

Мой текущий обходной путь использует только 1 Resque Worker. Я бы хотел масштабировать и обрабатывать задания быстрее. Есть идеи?

Редактировать: у меня изначально были проблемы с поиском ключевых слов для поиска в Google, но благодаря Робину я нашел ответ на свой вопрос здесь.

Правильный ответ - использовать increment_counter или же update_counters если вам нужно увеличить несколько атрибутов или значение, отличное от +1. Оба они являются модельными классами.

0 ответов

Другие вопросы по тегам