首页 > 解决方案 > 等待时间后 Sidekiq 排队作业

问题描述

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

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

标签: ruby-on-railssidekiqrails-activejob

解决方案


你可以做几件事:

  1. 在工作人员中实施检查以确保对象存在;否则,重新排队作业。可能想要考虑这一点,以确保您不会不小心将糟糕的工作重新排入队列,但这对您来说似乎是一个很好的健全性检查。

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


推荐阅读