gpt4 book ai didi

heroku - 如何从 DelayedJob 迁移到 Sidekiq

转载 作者:可可西里 更新时间:2023-11-01 11:01:13 26 4
gpt4 key购买 nike

我的应用程序使用 DelayedJob,但速度很慢,所以我决定切换到 Sidekiq。

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

从 DelayedJob 迁移到 Sidekiq 时,我首先更新了我的个人资料:

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 中:

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

我捆绑的 gemfile 包括:

ruby "2.0.0"
gem "rails", "4.0.2"
gem 'sinatra', require: false
gem 'slim'
gem "sidekiq"
gem "autoscaler"

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

# 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

典型的配置/sidekiq.yml:

:verbose: false
:concurrency: 25
:queues:
- [often, 7]
- [default, 5]
- [seldom, 3]

然后在你的 Procfile 中,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 所做的唯一更改是在 fork 时处理 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com