Sidekiq无法处理队列

77

可能有哪些原因导致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

你怎么找出问题出在哪里?有没有隐藏的日志文件?
13个回答

163

在我们的情况下,问题出在 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。如果配置文件没有被加载,那么在配置文件中定义的所有内容都是无用的。因此,请确保首先使用正确的配置文件。

4
问题在于我的工作者将 queue_as 设置为一个不在我的 sidekiq.yml 文件中的队列。 - stephen.hanson
3
你确定这样可以吗?应该是 sidekiq -q queue_name_1 -q queue_name_2,直接传递队列名称(逗号后面不允许有空格)。 - Wojtek Kosak Główczewski
完整的命令应该像这样: 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 - Lalit Yadav
8
我不知道对于2013年是否如此,但在2017年,sidekiq会自动加载/config/sidekiq.yml文件。 - Aleks
1
正如Wojtek所指出的那样,命令行标志-q queue_name_1,queue_name_2是不正确的。您需要为每个队列使用专用的-q标志(参见文档)。使用逗号后跟整数来指示队列权重。(我曾试图修正答案以达到这个效果,但编辑被拒绝了。) - bovender

14
如果您有一个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

11

我花了好几个小时才发现我设置了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

这实际上是帮助了我。谢谢。 - undefined

5

我的问题是我有一个配置服务器但没有配置客户端在我的初始化器中,你必须同时拥有两者:

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

4

在我的情况下,Sidekiq在开发环境中运行正常,但在staging中卡住了。这是因为Capistrano的部署配置出了人为错误。我在Capfile中错误地设置了sidekiq.yml的路径(使用了shared而不是current)。

它默默地失败了:

# Capfile

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

3

清空 Redis 数据库对我很有效。

警告:这将删除您的 Redis 数据库中的所有数据。

redis-cli flushall

5
警告!如果您不知道此事先的含义,请注意:删除所有现有数据库的所有键,而不仅仅是当前选定的数据库。(https://redis.io/commands/FLUSHALL) - AndreDurao

1

我花了至少两个小时的时间,因为队列、配置和Web UI都没有问题......只是作业没有被处理。我的问题是,在这里的command部分应该已经启动sidekiq-server,但在我的docker-compose设置中它并没有运行。

 sidekiq:
    depends_on:
      - 'proddb'
      - 'redis'
    build: rails-app
    --> command: bundle exec sidekiq --environment ${RAILS_ENV} -C config/sidekiq.yml
    volumes:
      - './rails-app:/project'
      - '/project/tmp' # don't mount tmp directory
    environment:
      - REDIS_URL_SIDEKIQ=${REDIS_URL_SIDEKIQ}
    networks:
      - backend

1

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


1

我在这个问题上纠结了一段时间,我的问题是sidekiq需要更新版本的redis-server。我运行了"bundle exec sidekiq"并且发现了错误。一旦我更新到了一个较新的redis-server版本,问题就解决了。


0

我遇到了类似的问题,日志显示了这样的条目:INFO Rails : queueing TestWorker (TestWorker)。 然而,作业永远不会被处理,而且这个问题中的任何答案都没有解决这个问题。

我的解决方案是 Sidekiq的测试客户端 意外触发了。

最终我推断出,在幕后进行了一些 "魔术",使得很难确定上述测试触发器在何时、何处、以何种方式进行配置,根据以下轶事...

运行 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接