私はsidekiq
非同期ジョブを処理するために使用していますが、複雑さが増した後、ジョブの状態を認識するのに苦労しています。
取引は次のとおりです。
Batch
コミット後に非同期メソッドを呼び出すモデルがあります。
# app/models/batch.rb
class Batch < ActiveRecord::Base
after_commit :calculate, on: :create
def calculate
job_id = BatchWorker.perform_async(self.id)
# update_column skips callbacks and validations!
self.update_column(:job_id, job_id)
end
end
ワーカーはモデルからデータを読み取り、次のように各データの非同期ジョブを呼び出します。
# app/workers/batch_worker.rb
class BatchWorker
def perform(batch_id)
batch = Batch.find(batch_id)
## read data to 'tab'
tab.each do |ts|
obj = batch.item.create(name: ts[0], data: ts[1])
job_id = ItemWorker.perform_async(obj.id)
obj.update_attribute(:job_id, job_id)
end
end
end
問題は次のとおりです。これらの非同期ジョブは計算を実行し、ダウンロード結果のリンクが完了する前に利用できるようにすることはできません。そのため、すべての「子ジョブ」がいつ完了するかを知る必要があります。これにより、モデルstatus
から属性を変更できます。 Batch
。つまり、すべてのジョブがキューに入れられているかどうかを知る必要はありませんが、代わりに、によって生成されたすべての非同期ジョブItemWorker
が実行され、完了したかどうかを知る必要があります。
- これを達成するための最良の方法は何でしょうか?「並列計算の世界」では意味がありますか?
Obs .: job_idは揮発性のようであるため、dbに保存するかどうかはわかりません。