Sidekiq的Active Record问题

时间:2017-06-13 09:54:45

标签: ruby-on-rails activerecord sidekiq

我在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秒后超时,无需处理。这里有什么我想念的东西。有一个更好的方法吗?

2 个答案:

答案 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