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?
这正是您的代码中发生的情况。
谁能解释一下如果两周内安排的 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?
这正是您的代码中发生的情况。