70

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

你怎么知道出了什么问题?是否有任何隐藏的日志文件?

4

11 回答 11

158

原因就在我们的例子中: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 在第三个队列(默认队列)中等待作业。您必须通过-Cor--config选项将配置文件的路径作为参数传递:

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

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

bundle exec sidekiq -q queue_name_1,queue_name_2

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

于 2013-05-30T12:53:32.487 回答
12

如果您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
于 2016-08-29T19:26:50.060 回答
6

我花了几个小时才发现我已经设置了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
于 2020-10-06T08:21:39.210 回答
5

我的问题是我的初始化程序中有一个 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
于 2019-01-17T14:33:23.817 回答
3

在我的情况下,sidekiq 在开发中很好,但在 staging 中停滞不前。这是 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') }
于 2018-11-09T19:52:59.070 回答
2

冲洗redis对我有用。在终端:

redis-cli flushall
于 2021-04-30T16:43:42.647 回答
1

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

于 2016-04-27T12:57:52.217 回答
1

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

于 2017-03-04T19:23:38.260 回答
0

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

于 2020-08-11T07:12:35.637 回答
0

我遇到了类似的问题,其中日志会显示诸如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

^ 这 2 个命令之间的唯一区别是我将development环境sidekiq.yml重命名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
于 2021-03-04T00:53:33.693 回答
0

My issue was that I had both a redis-server running and Redis.app's redis-server running, I killed the redis-server (and kept the Redis.app one)

于 2022-01-15T14:23:01.637 回答