Sidekiq 在等待时间后排队工作

Her*_*sta 2 ruby-on-rails sidekiq rails-activejob

问题是处理对象的 sidekiq 工作线程在对象存在于数据库之前运行。该作业正在对象模型中的 after_commit 回调中发送到队列。这是可能的,因为我有两个复制的数据库,一个用于读取,另一个用于插入。所以进程从入队到失败的时间与数据复制到数据库中的时间相比是次要的。

解决方案的最佳方法是什么?我想在入队和进程之间添加一些等待时间,以确保数据在从数据库中。在 sidekiq 配置或类似配置中是否有可能?

mat*_*ski 7

你可以做几件事:

  1. 在 worker 中执行检查以确保对象存在;否则,重新排队作业。可能想要考虑这一点,以确保您不会意外地将坏工作永远重新排队,但这对您来说似乎是一个很好的健全性检查。

  2. 引入延迟。特别是,sidekiq 可以等待从队列中拉取作业直到指定时间。

    “Sidekiq 允许您安排作业执行的时间。您使用 perform_in(interval, *args) 或 perform_at(timestamp, *args) 而不是标准的 perform_async(*args):

    MyWorker.perform_in(3.hours, 'mike', 1) MyWorker.perform_at(3.hours.from_now, 'mike', 1)

    有关此选项的更多详细信息,请参阅https://github.com/mperham/sidekiq/wiki/Scheduled-Jobs

就我个人而言,我会选择#1,但如果您绝望,#2 可能是一个更快的解决方案。

  • 是的。`GuestsCleanupJob.set(wait: 1.week).perform_later(guest)` 或 `GuestsCleanupJob.set(wait_until: Date.tomorrow.noon).perform_later(guest)` 来自 https://edgeguides.rubyonrails.org/active_job_basics。 html#enqueue-the-job (4认同)