Sidekiq 不处理队列

Sidekiq可以阻止处理队列中的作业的可能原因是什么?队伍已经满了。日志文件 sidekiq.log表示根本没有活动。因此,队列已满,但日志为空,并且 Sidekiq 似乎不处理项目。似乎没有工人处理工作。重新启动 Redis 或用 冲厕所FLUSHDB冲洗它都没有效果。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

您如何找出出错的地方? 是否有任何隐藏的日志文件?

60476 次浏览

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

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

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

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

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

bundle exec sidekiq -q queue_name_1,queue_name_2

To find the problem out it is helpful to pass the option -v or --verbose at the command line, too, or to use :verbose: true in the sidekiq.yml file. Everything which is defined in a config file is of course useless if the config file is not loaded.. Therefore make sure you are using the right config file first.

有段时间我一直在想这个问题,我的问题是 sidkiq 需要一个新版本的 Redis-server。我运行了“ bundle exec sidekiq”,发现了错误。一旦我升级到一个新版本的 Redis-server,它就没问题了。

如果使用 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

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

在我的案例中,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') }

我的问题是,在我的初始化程序中有 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

我的问题是,我没有正确配置我的 initializers/sidekiq.rb,但即使配置正确,sidekiq 仍然没有运行排队作业。我不得不在它上面运行 spring stop并重新启动所有东西,它解决了我的问题。

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

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

我的解决方案的 tl; dr 是 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

冲洗红外线对我有用。

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

redis-cli flushall

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

在这方面也花了至少两个小时,因为队列、配置和 web UI 都很好... ... 这些作业只是没有被处理。 我的问题是 sidkiq-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