等待时间后 Sidekiq 排队作业

Sidekiq enqueue job after a wait time

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

解决问题的最佳方法是什么?本来想在enqueue和process之间加一些等待时间,保证数据在从库。 sidekiq 配置或类似配置是否可行?

你可以做几件事:

  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 可能是一个更快的解决方案。