相关工作人员中的参数数量减少后如何处理已经排队的工作?

How to handle already enqueued jobs after number of args in related worker has been reduced?

假设我有一个带有一些参数的工人:

class Foo
  include Sidekiq::Worker
  sidekiq_options queue: :critical

  def perform(param1, param2, param3)
    ...
  end
end

它工作了一段时间,然后我减少了工人参数的数量:

class Foo
  include Sidekiq::Worker
  sidekiq_options queue: :critical

  def perform(param1, param2)
    ...
  end
end

但是队列中仍有一些作业具有之前的参数数量。处理这种情况的最佳方法是什么?

您要么需要清空队列(并防止其他作业入队)一段时间,要么您需要 cancel/delete 这些作业。

您可以取消这些工作,但 Sidekiq 的作者不建议这样做。 sidekiq wiki 将其解释为:

Sidekiq does not provide this functionality; it's safer and better for the application to do it. You should implement something like this:

class MyWorker
  include Sidekiq::Worker

  def perform(args)
    return if cancelled?
    # do stuff
  end

  def cancelled?
    Sidekiq.redis {|c| c.exists("cancelled-#{jid}") }
  end

  def self.cancel!(jid)
    Sidekiq.redis {|c| c.setex("cancelled-#{jid}", 86400, 1) }
  end
end

最安全的选择可能是选项 1。

这样做:

def perform(param1, param2, _=nil)

下划线是约定俗成的意思 "this argument is unused and ignored" 而 nil 默认表示 perform 将使用 2 或 3 个参数。

排空队列中的旧作业后,您可以完全删除第三个参数。