我已经在Heroku生产环境上面尝试了两天,但是一直没能让Sidekiq正常工作。我阅读了所有相关问题的可用文档,但仍然无法找到有效的解决方案,真的需要帮助!
在部署到Heroku之后,我的应用程序崩溃并且我得到以下错误堆栈跟踪:
2014-09-23T23:38:40.905093+00:00 app[worker.1]: No such file or directory @ rb_sysopen - /app/tmp/pids/sidekiq.pid
2014-09-23T23:38:40.905122+00:00 app[worker.1]: /app/vendor/bundle/ruby/2.1.0/bin/sidekiq:23:in `<main>'
2014-09-23T23:38:40.905119+00:00 app[worker.1]: /app/vendor/bundle/ruby/2.1.0/gems/sidekiq-3.2.5/bin/sidekiq:7:in `<top (required)>'
2014-09-23T23:38:40.905117+00:00 app[worker.1]: /app/vendor/bundle/ruby/2.1.0/gems/sidekiq-3.2.5/lib/sidekiq/cli.rb:347:in `write_pid'
2014-09-23T23:38:40.905115+00:00 app[worker.1]: /app/vendor/bundle/ruby/2.1.0/gems/sidekiq-3.2.5/lib/sidekiq/cli.rb:347:in `open'
2014-09-23T23:38:40.905121+00:00 app[worker.1]: /app/vendor/bundle/ruby/2.1.0/bin/sidekiq:23:in `load'
2014-09-23T23:38:40.905118+00:00 app[worker.1]: /app/vendor/bundle/ruby/2.1.0/gems/sidekiq-3.2.5/lib/sidekiq/cli.rb:41:in `parse'
2014-09-23T23:38:40.905114+00:00 app[worker.1]: /app/vendor/bundle/ruby/2.1.0/gems/sidekiq-3.2.5/lib/sidekiq/cli.rb:347:in `initialize'
2014-09-23T23:38:39.588001+00:00 heroku[worker.1]: State changed from starting to up
首先,在我的本地机器上,Sidekiq正常工作。我正在使用Heroku的REDISTOGO来进行Redis操作,对于本地生产环境,Sidekiq已正确指向REDISTOGO并且正常运行。
其次,根据堆栈跟踪,特别是这一行No such file or directory @ rb_sysopen - /app/tmp/pids/sidekiq.pid
;我认为由此可以推断出在Heroku上运行时,由于某种原因未能正确生成sidekiq.pid
文件。在本地环境中,每次在app/tmp/pids/
目录下启动应用程序时,都会生成sidekiq.pid
文件,并为其分配不同的pid
号码。我猜测在Heroku上运行时,sidekiq
试图从该文件中读取,但却找不到它。
这是我的Procfile
中的内容:
web: bundle exec rails server
worker: bundle exec sidekiq -C config/sidekiq.yml
这是我 config/sidekiq.yml
文件中的内容。
---
:verbose: true
:pidfile: ./tmp/pids/sidekiq.pid
:concurrency: 25
# Set timeout to 8 on Heroku, longer if you manage your own systems.
:timeout: 8
:queues:
- carrierwave
这是我 sidekiq.rb
的内容。
Sidekiq.configure_server do |config|
config.redis = { :url => ENV['REDISTOGO_URL'], :namespace => "mynamespece"}
end
Sidekiq.configure_client do |config|
config.redis = { :url => ENV['REDISTOGO_URL'], :namespace => "mynamespece"}
end
更新1
:
我正在使用与sidekiq
同步的carrierwave
和carrierwave-backgrounder
。
pid
。我是sidekiq的新手,我认为这是默认行为,因为在我的实现过程中,我没有遇到任何引用pid
的配置。你有什么建议吗?也许不使用pid是实现sidekiq的最佳方式?我没有找到太多关于pid部分的文档。 - Stephensforeman start
命令时,都会看到以下几行:17:28:57 web.1 | started with pid 20788
17:28:57 worker.1 | started with pid 20789
pid 号码每次都不同。 - Stephenscarrierwave
和carrierwave-backgrounder
与sidekiq
,所以也许使用pid
是由于carrierwave
的实现而做出的决定。 - Stephenssidekiq.yml
中的pidfile
行确实解决了No such file or directory @ rb_sysopen - /app/tmp/pids/sidekiq.pid
错误消息的问题;但是,现在当我在本地环境使用Procfile
中的foreman create
命令以及bundle exec sidekiq -C config/sidekiq.yml
时,worker 不再从队列中获取作业。之前加入sidekiq.yml
的pidfile
行还能够正常工作。 - Stephens