当 Sidekiq worker 试图过快地引用模型时如何在它中重新加载模型

How to reload a model in Sidekiq worker when it tries to reference the model too fast

当用户单击 Rails UI 中的按钮时,它会触发一个工作程序查找用户创建的记录。例如,当用户创建一个“计划”以在预定义的时间(有时是立即)开始时,工作人员将被启动并尝试找到该计划,有时会因“找不到记录”错误而失败。

class TestWorker
    include Sidekiq::Worker
    sidekiq_options queue: Rails.env.to_sym

    def perform(schedule_id)
        begin
            schedule = ScheduledTest.find(schedule_id)
        rescue
            sleep 5 # schedule was just created so needs time to update in db
            TestWorker.perform_async(schedule_id)
            return
        end
    end
end

这是当前的解决方法。当 worker 启动太快而找不到调度时,我现在让它再次调用自己,然后它就可以工作了。但是,似乎应该有一种方法可以“重新加载”模型而不是重新启动整个工作人员。

处理此问题的一种方法是利用 ActiveRecord 提供的回调周期。

after_create来到mind:https://apidock.com/rails/ActiveRecord/Callbacks/after_create

因此在您的 ScheduleTest 模型中:

after_create :trigger_worker

def trigger_worker
  TestWorker.perform(id)
end

或者,您可以调用 perform_async(id) 将其转储到队列中

您正在寻找 :after_commit 回调,因此在提交数据库事务之前不会创建作业。

https://github.com/mperham/sidekiq/wiki/FAQ#why-am-i-seeing-a-lot-of-cant-find-modelname-with-id12345-errors-with-sidekiq