让sidekiq立即执行一份工作

dag*_*da1 47 ruby sidekiq

目前,我有一个像这样的sidekiq工作:

class SyncUser
  include Sidekiq::Worker

  def perform(user_id)
    #do stuff
  end
end
Run Code Online (Sandbox Code Playgroud)

我正在这样的队列中找到一份工作:

SyncUser.perform_async user.id
Run Code Online (Sandbox Code Playgroud)

当然这一切都有效但调用perform_async和实际执行的作业之间存在一点滞后.

还有什么我可以告诉sidekiq立即执行这项工作吗?

Win*_*eld 90

这里有两个问题.

如果要立即执行作业,可以在当前上下文中使用:

SyncUser.new.perform(user.id)
Run Code Online (Sandbox Code Playgroud)

如果要减少正在计划的异步工作与在sidekiq worker中执行的异步工作之间的延迟,可以减小poll_interval设置:

Sidekiq.configure_server do |config|
  config.poll_interval = 2
end
Run Code Online (Sandbox Code Playgroud)

poll_interval是工人如何频繁地检查队列作业工人后端内的延迟.正在安排和与自由工作人员一起执行的工作之间的平均时间poll_interval / 2.

  • 如果有人想知道,默认的 poll_interval 当前是 15 秒。https://github.com/mperham/sidekiq/wiki/Scheduled-Jobs#checking-for-new-jobs (3认同)
  • 这有什么缺点吗?这会扰乱并发吗? (3认同)
  • 更新@BryceJohnson,自 Sidekiq 5.1 起,默认值为 5 秒。 (3认同)

its*_*lay 7

使用.perform_inline

SyncUser.perform_inline(user.id)
Run Code Online (Sandbox Code Playgroud)

甚至在你的生产控制台中:

SyncUser.perform_inline(user.id)
Run Code Online (Sandbox Code Playgroud)