Rails 应用程序在交易中包装延迟作业的影响

Implications of Wrapping Delayed Job in Transaction for Rails App

谁能解释一下如果两周内安排的 delayed_job 失败,下面的代码会发生什么情况?

我的理解是,整个事务将驻留在内存中,直到事务成功运行或耗尽允许的尝试次数(即事务不仅仅保证创建作业本身)。我对么?如果有人还可以详细说明此结构的含义(即内存泄漏、竞争条件、性能等)和潜在的改进,我们将不胜感激!

...

def process
  old_user.transaction(requires_new: true) do
    begin
      update_user_attributes

      TransferUserDataJob.new(old_user, new_user).delay(run_at: 14.days.from_now, queue: 'transfer_user_data_queue').perform       

      raise ActiveRecord::Rollback if user.status.nil?
    rescue Exception => e
      raise ActiveRecord::Rollback
    end
end

...

该代码未按照您的预期执行。

这部分:

TransferUserDataJob.new(old_user, new_user).delay(run_at: 14.days.from_now, queue: 'transfer_user_data_queue').perform 

将安排该作业由单独的进程执行,通常在单独的服务器上。因此,它不会 运行 在您的交易上下文中。

相反,您需要进入 TransferUserDataJob class 并将 transaction 放入 perform 方法中。

不,交易不会等待两周。这正是 后台作业存在的原因:稍后再做 expensive/heavy 事情,以便前端可以尽快响应。如果您的用户转移过程需要在同一笔交易中进行,要么将所有事情都转移给工作人员,要么当场完成所有事情,不要拖延。

That is, transaction doesn't merely guarantee that the job itself is created?

这正是您的代码中发生的情况。