Sidekiq 的活动记录问题
Active Record issue with Sidekiq
我在 rails 中创建了一个查询资源。发布查询时,我创建查询记录并使用 Sidekiq 在后台触发 2 个任务工作人员。
除了具有查询参数之外,我的查询模型还包含每个任务工作者的状态。在创建查询时,每个任务的状态设置为 "created"。
@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 秒的处理时间,并将状态设置为 "completed" 或 "failed"。但是任务 2 在 10 秒后没有看到更新和超时,没有处理。我在这里缺少什么吗?有一个更好的方法吗?
试试这个
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
But Task 2 never sees the update & times out after 10 secs, without processing
我怀疑是缓存问题(Query.find(query_id)
命中缓存而不是数据库)。尝试在每次重试时使用 q.reload
而不是 q = Query.find(query_id)
。
或者,更好的办法是,在 Task1 完成后安排 Task2,这样您就不必长时间束手无策地无所事事。
我在 rails 中创建了一个查询资源。发布查询时,我创建查询记录并使用 Sidekiq 在后台触发 2 个任务工作人员。
除了具有查询参数之外,我的查询模型还包含每个任务工作者的状态。在创建查询时,每个任务的状态设置为 "created"。
@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 秒的处理时间,并将状态设置为 "completed" 或 "failed"。但是任务 2 在 10 秒后没有看到更新和超时,没有处理。我在这里缺少什么吗?有一个更好的方法吗?
试试这个
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
But Task 2 never sees the update & times out after 10 secs, without processing
我怀疑是缓存问题(Query.find(query_id)
命中缓存而不是数据库)。尝试在每次重试时使用 q.reload
而不是 q = Query.find(query_id)
。
或者,更好的办法是,在 Task1 完成后安排 Task2,这样您就不必长时间束手无策地无所事事。