【问题标题】:Active Record issue with SidekiqSidekiq 的 Active Record 问题
【发布时间】:2017-06-13 09:54:45
【问题描述】:

我在 Rails 中创建了一个查询资源。发布查询后,我创建查询记录并使用 Sidekiq 在后台解雇 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 更新为“完成”或“失败”

 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 秒后从未看到更新和超时,没有处理。有什么我在这里想念的吗。有一个更好的方法吗?

【问题讨论】:

    标签: ruby-on-rails activerecord sidekiq


    【解决方案1】:

    但任务 2 在 10 秒后从未看到更新并超时,没有处理

    我怀疑缓存有问题(Query.find(query_id) 命中缓存而不是数据库)。每次重试时尝试使用q.reload 而不是q = Query.find(query_id)

    或者,更好的是,在 Task1 完成时安排 Task2,这样您就不必长时间束缚您的工作人员,什么都不做

    【讨论】:

    • 工作就像一个魅力。谢谢塞尔吉奥。
    【解决方案2】:

    试试这个

    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
    

    【讨论】:

    • 它应该如何帮助解决这个问题?更好的代码,是的,但它做同样的事情并且会以同样的方式失败
    • 我不知道,我发现while q.task1_status == "created" 可疑,所以直接在找到的对象上检查task1_status,而不是在外面声明它并在循环内分配它......并且不能真正重现它是不可验证的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    相关资源
    最近更新 更多