2015-08-14 39 views
0

我正在使用排隊系統(Sidekiq)並希望移動到ActiveJob以獲得性能優勢,而不必每次將ActiveRecord對象傳遞給工作人員時都要查詢數據庫。我想詢問並確認,因爲我不是100%確定的,但我的理解是,當ActiveJob使用GlobalID傳遞ActiveRecord對象時,所有對象都在內存中完成,並且對數據庫的單獨查詢未完成時,是正確的?ActiveJob GlobalID和內存中的ActiveRecord對象

回答

1

這是不正確的。

如果您使用ActiveJob,它會將任何ActiveRecord對象序列化爲global_id字符串以保存到您的隊列中。然後在作業開始時再從字符串中查找它。默認情況下,該字符串只包含應用程序名稱,類名稱和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提供的內容。