【问题标题】:How to handle already enqueued jobs after number of args in related worker has been reduced?减少相关工作人员中的参数数量后如何处理已排队的工作?
【发布时间】:2016-12-10 18:21:20
【问题描述】:

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

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

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

【问题讨论】:

    标签: ruby-on-rails ruby redis sidekiq


    【解决方案1】:

    这样做:

    def perform(param1, param2, _=nil)
    

    下划线是一个约定,意思是“这个参数未被使用和忽略”,nil 默认意味着 perform 将使用 2 或 3 个参数。

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

    【讨论】:

      【解决方案2】:

      您要么需要排空队列(并防止其他作业入队)一段时间,要么需要取消/删除这些作业。

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

      Sidekiq 不提供此功能;应用程序这样做更安全,更好。你应该实现这样的东西:

      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。

      【讨论】:

        猜你喜欢
        • 2012-09-14
        • 2014-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多