Почему в unicorn+mysql2 gem не отображается последняя версия данных модели при настройке нескольких рабочих продуктов?
Моя модель не обновляется корректно.
- Единорог радуги! на EventMachine
- MySQL драгоценный камень
Я могу воспроизвести в production
среда с 1000 об / мин на 8 рабочих. Если я обновлю my_model
в консоли Rails (с вызовом reload!
) все отлично работает. Локально я не могу воспроизвести это.
С контроллера:
# params[:my_model] = {:name => "new name"}
def update
@my_model = MyModel.first # {:name => "old name"}
Rails.logger.info @my_model.name
@my_model.update_attributes(params[:my_model])
redirect_to :action => :index
end
Журнал:
new name
old name
old name
old name
new name
Что я не прав? Спасибо за продвижение!
2 ответа
Похоже, что основной причиной является то, что sql-кеш не очищается между действиями, когда сервер находится под высокой нагрузкой, поскольку рабочие процессы не выходят из строя.
Я тестировал на сервере без нагрузки - проблема не воспроизводится. Приведенный ниже код из ApplicationController исправил эту проблему, но это решение выглядит несколько уродливо:
before_filter do
MyModel.current.connection.clear_query_cache
end
Кешируются ли данные в модели некоторыми работниками, так что данные выглядят как новое имя у одного работника, а старое имя у другого работника?
Было бы полезно добавить идентификаторы для каждой работы и вывести их в свой журнал. Другими словами, когда ваш работник запускается, он должен назначить себе идентификатор, уникальный от других работников (PID работника был бы хорошим кандидатом). Таким образом, вы можете увидеть, постоянно ли проблема возникает у одного или нескольких работников, или это все работники, или когда-то это только некоторые работники. Если это оказывается проблемой кеширования, возможно, вам просто нужно подождать, чтобы улов для всех объектов этого объекта был признан недействительным, и что в конечном итоге он покажет правильное, обновленное значение для всех работников.
Если вы не можете воспроизвести его локально, это потому, что вы используете только один экземпляр веб-сервера (один рабочий) при локальной разработке?
Кроме того, проверить вас production
логи и посмотреть, если слово CACHE
появляется в тех случаях, когда показывается старое имя.