相关工作人员中的参数数量减少后如何处理已经排队的工作?
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 个参数。
排空队列中的旧作业后,您可以完全删除第三个参数。
假设我有一个带有一些参数的工人:
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 个参数。
排空队列中的旧作业后,您可以完全删除第三个参数。