让Sidekiq立即执行任务

84

目前,我有一个类似于这样的 Sidekiq 工作:

class SyncUser
  include Sidekiq::Worker

  def perform(user_id)
    #do stuff
  end
end
我像这样将工作放入队列中:
SyncUser.perform_async user.id

这一切当然都有效,但是在调用 perform_async 和任务实际执行之间存在一定的延迟。

是否还有其他方法可以告诉 sidekiq 立即执行任务?


3
使用 Sidekiq 的整个想法是进行异步处理。如果您希望直接执行它,请确保有足够的可用工作进程,或者在请求本身中执行它。 - jewilmeer
3个回答

160

这里有两个问题。

如果你想立即执行一项工作,在当前环境下你可以使用:

SyncUser.new.perform(user.id)

如果您想减少Sidekiq工作器中异步工作被调度和执行之间的延迟,可以降低poll_interval设置:

Sidekiq.configure_server do |config|
  config.poll_interval = 2
end

poll_interval是工作进程中的延迟时间,用于确定工作进程在队列上检查作业的频率。从作业安排到空闲工作进程执行该作业之间的平均时间将为poll_interval / 2


8
如果有人想知道,当前的默认poll_interval是15秒。 https://github.com/mperham/sidekiq/wiki/Scheduled-Jobs#checking-for-new-jobs - Bryce Johnson
3
这样做有什么缺点吗?会影响并发性吗? - barnacle.m
1
Sidekiq使用Redis列表和原子操作非常适合并发。轮询间隔的长度不会影响并发,但会影响用于sidekiq队列的redis服务器的负载量。较长的轮询间隔意味着较少的轮询新工作,但工作在队列中停留的时间更长。较短的轮询间隔意味着队列中的时间更短,但是您的Sidekiq服务器会更频繁/高容量地轮询。 - Winfield
3
自从 Sidekiq 5.1 版本以后,默认值为 5 秒,更新 @BryceJohnson。 - Ray Baxter

4

使用.perform_inline

SyncUser.perform_inline(user.id)

甚至可以在您的生产控制台中:

require 'sidekiq/testing'
Sidekiq::Testing.inline!

SyncUser.perform_inline(user.id)

-3

对于那些通过Active Job框架使用Sidekiq的人,你可以这样做

SyncUser.perform_now(user.id)

2
这个答案是不正确的。请注意问题中有:include Sidekiq::Worker 而不是继承自 ActiveJob::Base - Brendan Benson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接