我在rails中创建了一个Query资源。当POST一个Query时,我使用Sidekiq在后台创建Query记录并激活2个任务工作者 除了具有查询参数之外,我的查询模型还包含每个任务工作者的状态。在创建查询时,每个任务的状态都设置为“已创建”。
@query = Query.create(param1: parameter1, param2: parameter2, task1_status: "created", task2_status: "created")
Task1Worker.perform_async(@query.id)
Task2Worker.perform_async(@query.id)
Task1 worker使用查询参数执行某些处理,并根据结果将task_status更新为“completed”或“failed”
q = Query.find(query_id)
status = process_task1()
if status == SUCCESS
q.task1_status = "completed"
else
q.task1_status = "failed"
end
q.save!
Task2 worker在开始处理之前等待Task1完成
q = Query.find(query_id)
count = 1
while q.task1_status == "created"
if count == 3
logger.error("Task1 state change timed out")
return
end
sleep(5)
q = Query.find(query_id)
end
status = process_task2()
if status == SUCCESS
q.task2_status = "completed"
else
q.task2_status = "failed"
end
q.save!
任务1需要大约4秒进行处理,并将状态设置为“已完成”或“已失败”。但任务2从未见过更新& 10秒后超时,无需处理。这里有什么我想念的东西。有一个更好的方法吗?
答案 0 :(得分:1)
但是任务2从未见过更新& 10秒后超时,无需处理
我怀疑缓存问题(Query.find(query_id)
命中缓存而不是数据库)。在每次重试时尝试使用q.reload
代替q = Query.find(query_id)
。
或者更好的是,在Task1完成时安排Task2,这样你就不必长时间地绑定你的工作人员 nothing 。
答案 1 :(得分:0)
试试这个
3.times do |count|
logger.error("Task1 state change timed out") and return if count == 2
if (q = Query.find(query_id)).task1_status != 'created'
q.task2_status = process_task2() == SUCCESS ? 'completed' : 'failed'
q.save!
end
sleep(5)
end