首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从DelayedJob迁移到Sidekiq

如何从DelayedJob迁移到Sidekiq
EN

Stack Overflow用户
提问于 2014-01-20 18:34:15
回答 1查看 480关注 0票数 1

我的应用程序可以在DelayedJob上运行,但速度很慢,所以我决定切换到Sidekiq。

到目前为止,它还没有与Sidekiq一起进行测试或开发。(当然,我也没有尝试过使用Sidekiq来推动生产。)

从DelayedJob迁移到Sidekiq时,我首先更新了我的Profile

代码语言:javascript
运行
复制
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

我假设这意味着我不必在foreman start之前输入bundle exec sidekiq,对吗?当我运行我的测试时,这应该也会启动sidekiq,对吗?

但在我的测试中,我的应用程序中所有以@instance.delay.method表示的东西(应该可以在DelayedJob和Sidekiq上使用)都不能正常工作。

因此,为了处理正在发生的事情,我在routes.rb中添加了以下内容

代码语言:javascript
运行
复制
Testivate::Application.routes.draw do
  require 'sidekiq/web'
  mount Sidekiq::Web, at: "/sidekiq"

但当我重启并访问localhost:3000/sidekiq时,我只看到:

代码语言:javascript
运行
复制
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似乎是在本地自动运行的:

代码语言:javascript
运行
复制
$ redis-cli ping
PONG

我捆绑的gemfile包括:

代码语言:javascript
运行
复制
ruby "2.0.0"
gem "rails", "4.0.2"
gem 'sinatra', require: false
gem 'slim'
gem "sidekiq"
gem "autoscaler"

我还没有对unicorn.rb做任何更改

代码语言:javascript
运行
复制
# 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
EN

回答 1

Stack Overflow用户

发布于 2014-02-07 02:44:06

我自己从DJ搬到了Sidekiq。虽然我在你的配置中看不到任何明显的东西,但我会分享我的设置,它正在工作。一些关于如何配置Sidekiq的建议。希望这能有所帮助。

对于initializers/redis.rb,同时支持local和heroku envs:

代码语言:javascript
运行
复制
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

对于初始化器/idekiq.rb(考虑参数化size)

代码语言:javascript
运行
复制
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/idekiq.yml:

代码语言:javascript
运行
复制
:verbose: false
:concurrency:  25
:queues:
 - [often, 7]
 - [default, 5]
 - [seldom, 3]

然后在您的配置文件中,sidekiq.yml:

代码语言:javascript
运行
复制
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连接:

代码语言:javascript
运行
复制
 ...
 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       
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21231612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档