【发布时间】:2020-05-11 18:00:21
【问题描述】:
我有一个 Rails 5 应用程序,我刚刚安装了 Sidekiq gem 作为 Rails ActiveJob 的后端。
我的问题是,即使我设法将工作排入队列并完成它,所有 Sidekiq 统计数据都卡在零。
我做了什么:
- 运行以下命令:
$ brew update
$ brew install redis
$ brew services start redis
- 添加了以下 gemfile:
# Gemfile
gem 'sidekiq'
gem 'sidekiq-failures', '~> 1.0'
- 运行以下命令:
$ bundle install
$ bundle binstub sidekiq
- 修改了以下文件:
# config/application.rb
class Application < Rails::Application
config.active_job.queue_adapter = :sidekiq
end
- 修改了获取监视器的路径(暂不进行认证)
# config/routes.rb
Rails.application.routes.draw do
require "sidekiq/web"
mount Sidekiq::Web => '/sidekiq'
end
- 添加了以下配置文件:
# config/sidekiq.yml
:concurrency: 3
:timeout: 60
:verbose: true
:queues: # Queue priority: https://github.com/mperham/sidekiq/wiki/Advanced-Options
- default
- mailers
- 在 3 个不同的选项卡中启动了 rails 服务器、sidekick 和 rails 控制台:
$ rails s
$ sidekiq
$ rails c
8.尝试在以下测试作业中使用perform_later:
class TestCreateSnippetJob < ApplicationJob
queue_as :default
def perform(shop_domain = "shoes-lab.myshopify.com")
puts "hello job"
sleep 30
end
end
$ TestCreateSnippetJob.perform_later
这是我得到的:
[1] pry(main)> TestCreateSnippetJob.perform_later
Enqueued TestCreateSnippetJob (Job ID: bc5bf654-09f5-4c77-95d8-8258a560525d) to Async(urgent)
=> #<TestCreateSnippetJob:0x00007feec140e9c8
@arguments=[],
@executions=0,
@job_id="bc5bf654-09f5-4c77-95d8-8258a560525d",
@priority=nil,
@provider_job_id="a59c111d-ebe1-43b2-bf23-55748b660af8",
@queue_name="urgent">
[2] pry(main)> Performing TestCreateSnippetJob (Job ID: bc5bf654-09f5-4c77-95d8-8258a560525d) from Async(urgent)
hello job
Performed TestCreateSnippetJob (Job ID: bc5bf654-09f5-4c77-95d8-8258a560525d) from Async(urgent) in 30038.27ms
我遇到的问题如下:即使 TestCreateSnippetJob 已完成,监视器 root/sidekiq 也没有显示任何“已处理”作业。每个统计数据都停留在 0。
此外,当我尝试从任务启动此作业时,什么也没有发生,作业没有执行,这与我尝试直接从控制台启动它时不同。
namespace :test do
desc "TODO"
task test: :environment do
TestCreateSnippetJob.perform_later
puts "Task done"
end
end
你们知道我做错了什么吗?
编辑
Rails (v5.2.3) 似乎覆盖了 ActiveJob queue_adapter。正如@Mike Perham 所提到的,我的日志显示我正在使用 :async 适配器,而不是 :sidekiq,即使我将 config.active_job.queue_adapter = :sidekiq 行添加到 config/application.rb.
所以我尝试将config.active_job.queue_adapter = :sidekiq 添加到config/environments/development.rb 并且这次sidekiq 工作正常,作业被排入Sidekiq。
但是,以这种方式执行此操作是否是一种好习惯?
PS:只有当我将config.active_job.queue_adapter = :sidekiq 行保留在config/application.rb. 和 config/environments/development.rb 中时,它才有效。
编辑 2
在这两种情况下,无论我是否在config/environments/development.rb 中添加config.active_job.queue_adapter = :sidekiq 行以及config/application.rb. 中的同一行,命令$ Rails.application.config.active_job_queue_adapter 都会返回:sidekiq
【问题讨论】:
标签: ruby-on-rails task jobs sidekiq monitor