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