等待时间后,Sidekiq入队工作

时间:2018-08-07 17:34:44

标签: ruby-on-rails sidekiq rails-activejob

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

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

1 个答案:

答案 0 :(得分:2)

您可以做一些事情:

  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可能会更快。