0x4*_*672 57 redis ruby-on-rails-3 sidekiq
Sidekiq可能会阻止处理队列中的作业有什么可能的原因?队列已满.日志文件sidekiq.log
表示根本没有活动.因此队列已满,但日志为空,而Sidekiq似乎不处理项目.似乎没有工人处理工作.重新启动Redis或使用FLUSHALL或FLUSHDB将其刷新为无效.Sidekiq已经开始了
捆绑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
Run Code Online (Sandbox Code Playgroud)
你怎么知道出了什么问题?有没有隐藏的日志文件?
0x4*_*672 131
原因在于我们的情况:Sidekiq可能会查找错误的队列.默认情况下,Sidekiq使用名为"default"的队列.我们使用了两个不同的队列名称,并在config/sidekiq.yml中定义了它们
# configuration file for Sidekiq
:queues:
- queue_name_1
- queue_name_2
Run Code Online (Sandbox Code Playgroud)
问题是,这个配置文件时自动加载默认情况下,在你的开发环境(不像database.yml
或者thinking_sphinx.yml
例如)通过简单的bundle exec sidekiq
命令.因此,我们在两个特定队列中编写了作业,而Sidekiq正在等待第三个队列中的作业(默认值).您必须通过-C
或--config
选项将路径作为参数传递给配置文件:
bundle exec sidekiq -C ./config/sidekiq.yml
Run Code Online (Sandbox Code Playgroud)
或者你可以直接传递队列名称(逗号后面不允许有空格):
bundle exec sidekiq -q queue_name_1,queue_name_2
Run Code Online (Sandbox Code Playgroud)
要找出问题,通过选项-v
或--verbose
在命令行中传递或在文件中使用是有帮助:verbose: true
的sidekiq.yml
.如果未加载配置文件,配置文件中定义的所有内容当然都是无用的.因此,请确保首先使用正确的配置文件.
如果您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
Run Code Online (Sandbox Code Playgroud)
检查是否在那里定义了所有队列.
如果您不确定队列的名称,可以使用以下脚本找出它:
require "sidekiq/api"
stats = Sidekiq::Stats.new
stats.queues
# {"production_mailers"=>25, "production_default"=>1}
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用队列执行操作:
queue = Sidekiq::Queue.new("production_mailers")
queue.count
queue.clear
Run Code Online (Sandbox Code Playgroud)
我花了几个小时才发现我已经设置了config.active_job.queue_name_prefix = "xxxxx_#{Rails.env}"
。设置中的队列名称看起来相同,但 sidekiq 查找带有前缀的队列。
app/jobs/my_job.rb
class MyJob < ApplicationJob
queue_as :default
end
Run Code Online (Sandbox Code Playgroud)
config/sidekiq.yml
:queues:
- default
Run Code Online (Sandbox Code Playgroud)
app/jobs/my_job.rb
class MyJob < ApplicationJob
queue_as :default
end
Run Code Online (Sandbox Code Playgroud)
config/sidekiq.yml
:queues:
- xxxxx_development_default
- xxxxx_production_default
Run Code Online (Sandbox Code Playgroud)
我的问题是我的初始化程序中有一个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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
34586 次 |
最近记录: |