ruby-on-rails - 对 Heroku 生产站点上的 Sidekiq 工作人员进行故障排除

标签 ruby-on-rails heroku sidekiq worker

我一直在我的开发环境中本地测试我的 sidekiq 工作人员,他们工作正常。然而,当我推送到 Heroku 时,我似乎无法让我的工作人员启动。

我不确定解决此问题的最佳方法,但这里有一些信息:

过程文件:

web: bundle exec unicorn -p $PORT -E $RACK_ENV -c ./config/unicorn.rb

我没有 sidekiq.yaml 文件。

unicorn .rb:

worker_processes Integer(ENV["WEB_CONCURRENCY"] || 3)
timeout 9999
preload_app true

before_fork do |server, worker|

  @sidekiq_pid ||= spawn("bundle exec sidekiq -c 2")
  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
worker_processes 3

after_fork do |server, worker|

  Sidekiq.configure_client do |config|
    config.redis = { :size => 1 }
  end
  Sidekiq.configure_server do |config|
    config.redis = { :size => 5 }
  end

  Signal.trap 'TERM' do
    puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to send QUIT'
  end

  defined?(ActiveRecord::Base) and
      ActiveRecord::Base.establish_connection
end

调用我的工作人员的 Rake 任务:

namespace :ivr do

  desc "For IVR"
  task get_welcome: :environment do
    NmeContactListWorker.perform_async('Welcome', 'IVR')
  end
end

当我调用此 rake 任务时,我在 Heroku 日志中收到以下内容:

2014-03-19T13:11:32.716759+00:00 heroku[api]: Starting process with command `bundle exec rake ivr:get_welcome` by test@gmail.com
2014-03-19T13:11:38.795843+00:00 heroku[run.3843]: State changed from starting to up
2014-03-19T13:11:38.711077+00:00 heroku[run.3843]: Awaiting client
2014-03-19T13:11:38.794029+00:00 heroku[run.3843]: Starting process with command `bundle exec rake ivr:get_welcome`
2014-03-19T13:11:47.171071+00:00 heroku[run.3843]: Process exited with status 0
2014-03-19T13:11:47.209653+00:00 heroku[run.3843]: State changed from up to complete

我不知道如何更清楚地了解我的员工失败的原因。什么可能导致这种情况在 Heroku 的生产环境中发生,但在本地工作正常?

最佳答案

在您的 procfile 中,您需要启动 sidekiq 进程:

# Procfile
web: bundle exec unicorn -p $PORT -E $RACK_ENV -c ./config/unicorn.rb
worker: bundle exec sidekiq

事实上,这就是我们在开发机器上启动 sidekiq、打开终端窗口并运行 sidekiq 命令的操作。您的 unicorn.rb 仅配置 Sidekiq,而不启动它。

注意:部署完成后,您必须在 heroku 上启动一个工作线程:

heroku ps:scale workers=1

关于ruby-on-rails - 对 Heroku 生产站点上的 Sidekiq 工作人员进行故障排除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22508654/

相关文章:

css - 如何使用 active_link_to 将边框直接定位在事件链接上? rails 4

ruby-on-rails - saved_change_to_attribute?在方法内部调用时总是返回 false

ruby-on-rails - Heroku css 在 Assets :precompile 之后未加载

docker - 使用 heroku.yml 部署到 Heroku 多个 docker 镜像,收到错误 : No default language could be detected for this app

ruby-on-rails-3 - 如何手动运行 Sidekiq 作业

ruby-on-rails - 升级到 devise 3.1 => 获取重置密码 token 无效

html - 如果方法没有返回数据,打印一个空的表格单元格

django - Procfile 中的 heroku $PORT 变量

ruby-on-rails-3 - 如何使用 Sidekiq 运行连续的后台作业?

ruby - Sidekiq 队列权重限制