我的应用程序正在使用delayedjob,但速度很慢,所以我决定切换到sidekiq。
到目前为止,它还没有用于sidekiq的测试或开发。(当然,我也没有尝试过用sidekiq来推动生产。)
当从delayedjob移动到sidekiq时,我首先更新了我的Profile
:
web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb
# worker: bundle exec rake jobs:work
before_fork do |server, worker|
@sidekiq_pid ||= spawn("bundle exec sidekiq -c 2")
end
我想这意味着我不必在
bundle exec sidekiq
之前键入foreman start
,对吧?当我运行我的测试时,这也应该从sidekiq开始,对吧?但在我的测试中,我的应用程序中所有表示为
@instance.delay.method
的内容(对于delayedjob和sidekiq都应该有效)都不起作用。因此,为了了解发生了什么,我在
routes.rb
中添加了以下内容:Testivate::Application.routes.draw do
require 'sidekiq/web'
mount Sidekiq::Web, at: "/sidekiq"
但当我重新开始并访问
localhost:3000/sidekiq
时,我只看到:No route matches [GET] "/sidekiq"
Routes
Routes match in priority from top to bottom
Helper HTTP Verb Path Controller#Action
Path / Url
sidekiq_web_path /sidekiq Sidekiq::Web
顺便说一句,redis似乎是在本地自动运行的:
$ redis-cli ping
PONG
我的捆绑产品包括:
ruby "2.0.0"
gem "rails", "4.0.2"
gem 'sinatra', require: false
gem 'slim'
gem "sidekiq"
gem "autoscaler"
我没有对
gemfile
做任何更改:# config/unicorn.rb
worker_processes 3
timeout 360
preload_app true
before_fork do |server, worker|
Signal.trap 'TERM' do
puts 'Unicorn master intercepting TERM and sending myself QUIT instead'
Process.kill 'QUIT', Process.pid
end
defined?(ActiveRecord::Base) and
ActiveRecord::Base.connection.disconnect!
end
after_fork do |server, worker|
Signal.trap 'TERM' do
puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to sent QUIT'
end
defined?(ActiveRecord::Base) and
ActiveRecord::Base.establish_connection
end
最佳答案
我自己从DJ转到Sidekiq。虽然在您的配置中看不到任何明显的内容,但我将分享我的设置。关于如何配置sidekiq的一些建议。希望这有帮助。
对于initializers/redis.rb,支持本地和heroku环境:
module MyRedis
class << self
def redis
@redis ||= Redis.new(url: (ENV['REDISTOGO_URL'] || 'redis://127.0.0.1:6379'))
end
##
# test for avail
#
def sidekiq?
begin
redis_info = Sidekiq.redis { |conn| conn.info }
true
rescue
false
end
end
end
end
对于initilizers/sidekiq.rb(考虑参数化
size
)Sidekiq.configure_server do |config|
config.redis = { :url => MyRedis.redis[:url], :namespace => 'sidekiq', :size => 4 }
end
Sidekiq.configure_client do |config|
config.redis = { :url => MyRedis.redis[:url], :namespace => 'sidekiq', :size => 1 }
end
典型的config/sidekiq.yml:
:verbose: false
:concurrency: 25
:queues:
- [often, 7]
- [default, 5]
- [seldom, 3]
然后在proc文件中,sidekiq.yml:
web: bundle exec unicorn -p $PORT -E $RAILS_ENV -c ./config/unicorn.rb
worker: bundle exec sidekiq -C config/sidekiq.yml -e $RAILS_ENV
最后,我对config/unicorn.rb所做的唯一更改是在forking上处理redis连接:
...
before_fork do |server, worker|
if defined?(MyRedis.redis)
MyRedis.redis.quit
Rails.logger.info('Disconnected from Redis')
end
...
after_fork do |server, worker|
if defined?(MyRedis.redis)
MyRedis.redis.client.reconnect
Rails.logger.info('Connected to Redis')
end
关于heroku - 如何从DelayedJob迁移到Sidekiq,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21231612/