Sidekiq在Heroku上运行时无法生成sidekiq.pid文件,使用Redistogo配合。

19

我已经在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同步的carrierwavecarrierwave-backgrounder


你为什么要创建一个pid文件呢? - Mike Perham
@MikePerham 嘿,Mike,我知道你是sidekiq的作者,感谢你对此事的关注!我没有有意使用pid。我是sidekiq的新手,我认为这是默认行为,因为在我的实现过程中,我没有遇到任何引用pid的配置。你有什么建议吗?也许不使用pid是实现sidekiq的最佳方式?我没有找到太多关于pid部分的文档。 - Stephens
@MikePerham 在我的本地环境中,每次我使用 foreman start 命令时,都会看到以下几行:17:28:57 web.1 | started with pid 20788 17:28:57 worker.1 | started with pid 20789pid 号码每次都不同。 - Stephens
@MikePerham 抱歉,我在原帖中忘记提到了这一点;我正在使用 carrierwavecarrierwave-backgroundersidekiq,所以也许使用 pid 是由于 carrierwave 的实现而做出的决定。 - Stephens
2
只需在您的Sidekiq.yml文件中删除pidfile行,问题就应该解决了。 - Mike Perham
@MikePerham 感谢您的回复,删除 sidekiq.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.ymlpidfile 行还能够正常工作。 - Stephens
3个回答

28

此问题已通过以下操作得到解决:

1)感谢 @MikePerham 指出正确的方向,首先我在我的 sidekiq.yml 文件中删除了这行:

:pidfile: ./tmp/pids/sidekiq.pid

2) 接着,在我的 Procfile 文件中,我需要使用以下行来替换原有的行:

web: bundle exec rails server -p $PORT
worker: bundle exec sidekiq -C config/sidekiq.yml

现在,对于我来说,Sidekiq在Heroku上与Redistogo正常工作。


这个像魔法一样奏效了。非常感谢! - Kees Briggs

14

我发现将目录添加到代码库并重新部署应用程序很有用。

mkdir -p tmp/pids
touch tmp/pids/.gitkeep
git add -f tmp/pids/.gitkeep
git commit -m 'Keep tmp/pids directory in repo'

希望这可以帮到你。


10

通过在项目根目录中的 /tmp 目录下创建 pids 目录,问题得以解决。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接