【问题标题】:How to clear all the jobs from Sidekiq?如何从 Sidekiq 清除所有作业?
【发布时间】:2014-09-13 05:08:20
【问题描述】:

我在 Rails 应用程序中使用 sidekiq 执行后台任务。现在工作的数量越来越多,所以我想清除所有的工作。我在控制台中尝试了以下命令

Sidekiq::Queue.new.clear

但它给出了以下错误。

NameError: uninitialized constant Sidekiq::Queue 

如何清除 sidekiq 中的所有作业?

【问题讨论】:

  • 尝试include 'sidekiq'之前
  • @BenjaminSinclaire 它给出 TypeError: wrong argument type String (expected Module)
  • 之前尝试require 'sidekiq'
  • 我总是(真的总是)混淆 include 和 require :)

标签: ruby-on-rails ruby sidekiq


【解决方案1】:

根据 Github 上的这个问题:https://github.com/mperham/sidekiq/issues/1732 你现在需要

require 'sidekiq/api'

【讨论】:

    【解决方案2】:

    您可以按照issue 1077 上的说明或在此blog at noobsippets 中报告的方式进行操作

    两者都建议我们执行以下操作,并且可以在 Rails 控制台上完成:

    Sidekiq.redis(&:flushdb)
    

    注意:此命令将清除所有 redis 记录。我建议不要在生产中使用它

    另一种方法是

    redis-cli --scan --pattern users: * | xargs redis-cli del
    

    根据this blog

    【讨论】:

    • 你好,布兰迪蒙。你是用redis来控制你项目的session吗?因为这些命令是为了“清理”所有存储在redis中的数据,所以相当于关系型数据库中的drop数据库或者drop table。
    • 考虑到它的投票,这应该是公认的答案。
    • 这种方法的问题是,如果您在不同的服务之间共享相同的 redis/elasticache,它也会清除 redis 数据库中的所有其他数据。
    • 这是我们发现的唯一可行的方法,可以确保所有重复的工作变更都会被采纳。作为自动化流程的一部分,我们每次进行构建时都会运行它。我们还有一个安全机制,可以通过我们应用程序的一个 API(在需要热重载的情况下)访问并重新守护 Sidekiq。至于刷新其他 redis 实例,我们有一个单独的 redis 实例,通过 docker 专门为 Sidekiq 运行,因此数据污染/丢失对我们的团队来说不是问题。感谢您发布此内容。
    • 请添加免责声明,这将刷新 redis,并清除 redis 框上的任何其他键
    【解决方案3】:

    清除 Sidekiq 作业命令:

    require 'sidekiq/api'
    
    # Clear retry set
    
    Sidekiq::RetrySet.new.clear
    
    # Clear scheduled jobs 
    
    Sidekiq::ScheduledSet.new.clear
    
    # Clear 'Dead' jobs statistics
    
    Sidekiq::DeadSet.new.clear
    
    # Clear 'Processed' and 'Failed' jobs statistics
    
    Sidekiq::Stats.new.reset
    
    # Clear all queues
    
    Sidekiq::Queue.all.map(&:clear)
    
    # Clear specific queue
    
    stats = Sidekiq::Stats.new
    stats.queues
    # => {"main_queue"=>25, "my_custom_queue"=>1}
    
    queue = Sidekiq::Queue.new('my_custom_queue')
    queue.count
    queue.clear
    

    【讨论】:

    • 您还可以使用Sidekiq::Queue.all.map(&:clear) 清除所有队列...当您将语言环境数据库与产品同步时很有用?
    【解决方案4】:
    redis-cli flushdb
    

    你也可以使用redis-cli flushall

    【讨论】:

    • 这种方法的问题是,如果您在不同的服务之间共享相同的 redis/elasticache,它也会清除数据库中的所有其他数据。
    【解决方案5】:

    在最新的 Sidekiq 中,把它炸掉:

    require 'sidekiq/api'
    
    q = Sidekiq::Queue.new
    q.?
    

    是的,清除所有命令实际上是一个炸弹表情符号。也适用于Sidekiq::RetrySet。

    或者如果你不开心,你可以使用q.clear

    【讨论】:

    • 天啊,这是什么鬼? @Xavier,有没有名为 .? 的方法,请您指导我有关此方法的文档(?)。
    • @codemilan 查看这篇博文:blog.honeybadger.io/…
    • 我在执行 q.? 时得到了 invalid byte sequence in US-ASCII (ArgumentError) :/
    【解决方案6】:

    在一行中使用 Rails runner

    rails runner 'Sidekiq.redis { |conn| conn.flushdb }'
    

    【讨论】:

      【解决方案7】:

      所有 Sidekiq 任务都保存在“Redis”中。

      你可以通过这个命令清理“Redis”

      redis-cli flushall
      

      【讨论】:

        【解决方案8】:

        您可以使用它来清除所有作业

        require 'sidekiq/api'
        
        Sidekiq::Queue.all.each(&:clear)
        

        【讨论】:

          【解决方案9】:
          require 'sidekiq/api'
          
          Sidekiq::Queue.all.each {|x| x.clear}
          

          【讨论】:

            【解决方案10】:

            如果您想从特定队列中删除作业,请尝试:

            queue = Sidekiq::Queue.new("default")
            queue.each do |job|
              job.klass # => 'TestWorker'
              job.args # => ['easy']
              job.delete if job.jid == 'abcdef1234567890' || job.klass == 'TestWorker'
            end
            

            阅读有关 sidekiq 和重要控制台命令的所有信息-https://medium.com/@shashwat12june/all-you-need-to-know-about-sidekiq-a4b770a71f8f

            【讨论】:

              【解决方案11】:

              我意识到Sidekiq.redis { |conn| conn.flushdb } 会从 redis 数据库中删除所有键。使用redis-cli 清除所有sidekiq 队列有一种更安全的方法:

              redis-cli keys "*queue:*" | xargs redis-cli del
              

              Sidekiq API 也可以实现同样的功能(参见Ravi Prakash Singh answer)

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2021-04-12
                • 1970-01-01
                • 2021-08-06
                • 2018-06-29
                • 1970-01-01
                • 2021-01-21
                • 2014-06-02
                相关资源
                最近更新 更多