【问题标题】:Get sidekiq to execute a job immediately让 sidekiq 立即执行作业
【发布时间】:2013-10-15 15:04:45
【问题描述】:

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

class SyncUser
  include Sidekiq::Worker

  def perform(user_id)
    #do stuff
  end
end

我将这样的工作放在队列中:

SyncUser.perform_async user.id

当然,这一切都有效,但是在调用 perform_async 和实际执行的作业之间有一点延迟。

我还能做些什么来告诉 sidekiq 立即执行作业吗?

【问题讨论】:

  • 使用 sidekiq 的整个想法是异步执行。如果您想直接执行它,请确保您有足够的工作人员可用,或者在请求本身中执行它。

标签: ruby sidekiq


【解决方案1】:

这里有两个问题。

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

SyncUser.new.perform(user.id)

如果您想减少安排异步工作与在 sidekiq worker 中执行之间的延迟,您可以减少poll_interval 设置:

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

poll_interval 是工作人员后端中工作人员检查队列中作业的频率的延迟。使用空闲工作人员安排和执行作业之间的平均时间为poll_interval / 2

【讨论】:

  • 如果有人想知道,默认 poll_interval 当前是 15 秒。 github.com/mperham/sidekiq/wiki/…
  • 这样做有什么缺点吗?这会与并发混淆吗?
  • Sidekiq 对 Redis 列表和原子操作的使用非常适合并发性。轮询间隔的长度不会影响并发性,但会影响用于 sidekiq 队列的 redis 服务器上的负载量。较长的轮询间隔意味着对队列中新作业的轮询频率较低,但作业在队列中花费的时间更多。更短的轮询间隔意味着更短的队列时间,但更频繁/更多来自 Sidekiq 服务器的轮询。
【解决方案2】:

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

SyncUser.perform_now(user.id)

【讨论】:

  • 这个答案不正确。注意问题有:include Sidekiq::Worker 而不是继承自 ActiveJob::Base
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-11
  • 1970-01-01
  • 1970-01-01
  • 2016-07-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多