2017-06-08 54 views
0

任何人都可以解釋如果在兩週內安排的delayed_job失敗,將在下面的代碼中發生什麼?在交易中包裝延遲工作對Rails應用程序的影響

我的理解是,整個事務將一直存在於內存中,直到事務成功運行或耗盡允許的嘗試次數(即事務不僅僅保證作業本身被創建)。我對麼?如果任何人也可以詳細說明這種結構的影響(即內存泄漏,競態條件,性能等)和潛在的改進,將不勝感激!

... 

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 

... 

回答

1

不,交易不會等待兩週。這是恰恰是後臺作業存在的原因:以後再做昂貴/繁重的內容,以便前端儘可能快地響應。如果您的用戶轉移過程需要在同一個交易中發生,請將所有內容都轉移給工作人員,或者在現場執行所有操作,而不會延遲。

也就是說,交易不僅僅保證工作本身是否被創建?

這正是您的代碼中發生的情況。

0

該代碼沒有達到您期望的效果。

這一部分:

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

將安排這項工作由一個單獨的進程中進行的,通常一個單獨的服務器上。所以,它不會在您的交易環境中運行。

相反,您需要進入TransferUserDataJob課程,並將transaction放在perform方法中。