2015-08-14 3 views
0

Я использую систему очередей (Sidekiq) и хочу перейти в ActiveJob, чтобы получить преимущество в производительности от необходимости запрашивать базу данных каждый раз, когда я передаю объект ActiveRecord рабочему. Я хотел спросить и подтвердить, так как я не был на 100% уверен, но я понимаю, что когда ActiveJob использует GlobalID для передачи объектов ActiveRecord, которые все сделаны в памяти, а отдельный запрос к базе данных не выполняется, правильно?ActiveJob GlobalID и объекты ActiveRecord с активной памятью

ответ

1

Неправильное.

Если вы используете ActiveJob, он сериализует любой объект ActiveRecord в строку global_id для сохранения в вашей очереди. Затем снова посмотрите на эту строку, когда начинается задание. По умолчанию эта строка включает только имя приложения, имя класса и идентификатор, и он будет использовать вашу базу данных для загрузки модели.

"gid://app/User/1" 

DelayedJob будет сериализовать любой объект, вы даете его в строку YAML и восстановить его, не задев DB за загрузку задания. Вы также можете сделать это с помощью Sidekiq, вместо этого нажми на Redis, чтобы загрузить задание и не касаться основной базы данных.

user = User.find(1) 
MyJob.perform_later(user.to_yaml) 

# Load the user object from the yaml 
YAML::load(user.to_yaml) == user # true 

Вы получите свой объект без поездки в БД. Однако этот YAML будет большим, и штраф за исполнение с Redis может не стоить того.

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

Надеюсь, что поможет вам понять, что предоставляют ActiveJob и GlobalId.

 Смежные вопросы

  • Нет связанных вопросов^_^