【问题标题】:Sidekiq not processing queueSidekiq 不处理队列
【发布时间】:2013-05-26 00:23:39
【问题描述】:

Sidekiq 可以阻止哪些可能的原因处理队列中的作业?队列已满。日志文件sidekiq.log 表示根本没有活动。因此队列已满但日志为空,Sidekiq 似乎没有处理项目。似乎没有工人处理工作。重新启动 Redis 或使用 FLUSHALLFLUSHDB 刷新它无效。 Sidekiq 已经开始使用

bundle exec sidekiq -L log/sidekiq.log

并生成以下日志文​​件:

2013-05-30..Booting Sidekiq 2.12.0 using redis://localhost:6379/0 with options {}
2013-05-30..Running in ruby 1.9.3p374 (2013-01-15 revision 38858) [i686-linux]
2013-05-30..See LICENSE and the LGPL-3.0 for licensing details.
2013-05-30..Starting processing, hit Ctrl-C to stop

如何找出问题所在?有没有隐藏的日志文件?

【问题讨论】:

    标签: ruby-on-rails-3 redis sidekiq


    【解决方案1】:

    原因是在我们的例子中:Sidekiq 可能会寻找错误的队列。默认情况下,Sidekiq 使用名为“default”的队列。我们使用了两个不同的队列名称,并在 config/sidekiq.yml 中定义了它们

    # configuration file for Sidekiq
    :queues:
      - queue_name_1
      - queue_name_2
    

    问题是这个配置文件不会自动加载在您的开发环境中(不像database.ymlthinking_sphinx.yml 例如)通过一个简单的bundle exec sidekiq 命令。因此,我们在两个特定队列中编写作业,Sidekiq 在第三个队列(默认队列)中等待作业。您必须通过-C--config选项将配置文件的路径作为参数传递:

    bundle exec sidekiq -C ./config/sidekiq.yml
    

    或者您可以直接传递队列名称(逗号后不允许有空格):

    bundle exec sidekiq -q queue_name_1,queue_name_2
    

    要找出问题,在命令行中传递选项-v--verbose 或在sidekiq.yml 文件中使用:verbose: true 会很有帮助。如果没有加载配置文件,配置文件中定义的所有内容当然是无用的。因此,请确保首先使用正确的配置文件。

    【讨论】:

    • 我的问题是我的工作人员将queue_as 设置为一个不在我的sidekiq.yml 文件中的队列。
    • > 或者您可以直接传递队列名称(逗号后不允许有空格):您确定这样可以吗?不应该是sidekiq -q queue_name_1 -q queue_name_2
    • 完整的命令应该是这样的bundle exec sidekiq -d -L log/sidekiq.log -C config/sidekiq.yml -e production 连同这个你应该把它添加到你的sidekiq.rb Sidekiq.configure_server do |config| config.redis = { url: 'redis://127.0.0.1:6379' } end Sidekiq.configure_client do |config| config.redis = { url: 'redis://127.0.0.1:6379' } end
    • 我不知道 2013 年是否如此,但在 2017 年 sidekiq 加载 /config/sidekiq.yml 自动。
    • 正如 Wojtek 指出的,命令行标志 -q queue_name_1,queue_name_2 不正确。您需要为每个队列使用专用的-q 标志(参见docs)。使用逗号后跟一个整数来表示队列权重。 (我曾试图更正这个结果的答案,但编辑被拒绝了。)
    【解决方案2】:

    如果您有 config/sidekiq.yml 检查所有队列是否已在此处定义,请检查此示例文件:https://github.com/mperham/sidekiq/blob/master/examples/config.yml

    如果您在命令行或 Procfile 中传递队列名称,类似于

    bin/sidekiq -q queue1 -q queue2
    bundle exec sidekiq -q queue1 -q queue2
    

    检查您的所有队列是否都在那里定义。

    如果您不确定队列的名称,您可以使用以下脚本找出答案:

    require "sidekiq/api"
    stats = Sidekiq::Stats.new
    stats.queues
    # {"production_mailers"=>25, "production_default"=>1}
    

    然后,你可以用队列做事:

    queue = Sidekiq::Queue.new("production_mailers")
    queue.count
    queue.clear
    

    【讨论】:

      【解决方案3】:

      我花了几个小时才发现我设置了config.active_job.queue_name_prefix = "xxxxx_#{Rails.env}"。设置中的队列名称看起来一样,但是sidekiq会查找带有前缀的队列。

      设置错误

      app/jobs/my_job.rb

      class MyJob < ApplicationJob
        queue_as :default
      end
      

      config/sidekiq.yml

      :queues:
        - default
      

      正确设置

      app/jobs/my_job.rb

      class MyJob < ApplicationJob
        queue_as :default
      end
      

      config/sidekiq.yml

      :queues:
        - xxxxx_development_default
        - xxxxx_production_default
      

      【讨论】:

        【解决方案4】:

        我的问题是我的初始化程序中有一个 configure_server 但没有 configure_client,你必须同时拥有:

        Sidekiq.configure_server do |config|
          config.redis = { url: ENV.fetch('SIDEKIQ_REDIS_URL', 'redis://127.0.0.1:6379/1') }
        end
        
        Sidekiq.configure_client do |config|
          config.redis = { url: ENV.fetch('SIDEKIQ_REDIS_URL', 'redis://127.0.0.1:6379/1') }
        end
        

        【讨论】:

          【解决方案5】:

          在我的情况下,sidekiq 在开发中很好,但在暂存中卡住了。这是 capistrano 部署配置的人为错误。我在 Capfile 中错误地设置了 sidekiq.yml 的路径(共享而不是当前)。

          它默默地失败了:

          # Capfile
          
          # WRONG:
          set :sidekiq_config, -> { File.join(shared_path, 'config', 'sidekiq.yml') }
                                              ^^^^^^^^^^^
          # RIGHT:
          set :sidekiq_config, -> { File.join(current_path, 'config', 'sidekiq.yml') }
          

          【讨论】:

            【解决方案6】:

            刷新 redis 对我有用。在终端:

            redis-cli flushall
            

            【讨论】:

            • 警告!如果您不知道这意味着什么,请事先记下:“删除所有现有数据库的所有键,而不仅仅是当前选择的一个”(redis.io/commands/FLUSHALL)
            【解决方案7】:

            我在这个问题上撞了一堵砖墙有一段时间了,我的问题是sidekiq需要更新版本的redis-server。我运行了“bundle exec sidekiq”,发现了错误。一旦我更新到新版本的 redis-server 就好了。

            【讨论】:

              【解决方案8】:

              我刚遇到这个问题。原来我在 sidekiq.yml 中犯了一个语法错误

              【讨论】:

                【解决方案9】:

                我的问题是我没有正确配置我的initializers/sidekiq.rb,但即使配置正确,sidekiq 仍然没有运行排队的作业。我必须在此基础上运行 spring stop 并重新启动一切,它解决了我的问题。

                【讨论】:

                  【解决方案10】:

                  我遇到了类似的问题,其中日志会显示诸如INFO Rails : queueing TestWorker (TestWorker) 之类的条目。但是,这些作业永远不会得到处理,并且此问题中的任何答案都无法解决问题。

                  我的解决方案的 tl;dr 是 Sidekiq's Testing Client 被意外触发。

                  根据以下轶事,我最终推断出表面之下存在一些“魔法”,这使得难以离散地确定上述测试触发器的配置位置/时间/方式...

                  运行bundle exec sidekiq -C config/sidekiq.yml -e development 的结果是Sidekiq::Testing.fake? == true

                  但是,运行 bundle exec sidekiq -C config/sidekiq.yml -e development_2 的结果是 Sidekiq::Testing.fake? == false

                  ^ 这两个命令之间的唯一区别是我将sidekiq.yml 中的development 环境重命名为development_2,即使用两个命令运行相同/等效的环境(至少,大概是相同的)如果不是引擎盖下的这种愚蠢的“魔法”,环境)。

                  我更新了sidekiq.rb 以通过以下方式显式切换Sidekiq::Testing

                  sidekiq_testing_fake = false  # set this using env var, etc.
                  if sidekiq_testing_fake
                    Sidekiq::Testing.fake!
                  elsif Sidekiq.constants.include?(:Testing)
                    Sidekiq::Testing.disable!
                  end
                  

                  【讨论】:

                    【解决方案11】:

                    我的问题是我同时运行了 redis-server 和 Redis.app 的 redis-server,我杀死了 redis-server(并保留了 Redis.app)

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 2015-07-06
                      • 2018-09-27
                      • 2014-08-26
                      • 2016-06-17
                      • 2012-10-24
                      • 1970-01-01
                      • 1970-01-01
                      • 2016-08-27
                      相关资源
                      最近更新 更多