Rails:在Heroku上启动Sidekiq

时间:2012-12-07 20:45:45

标签: ruby-on-rails heroku sidekiq

我在使用Heroku部署的Rails应用程序启动并运行Sidekiq时出现问题。我的应用程序在开发中运行良好(在没有Sidekiq的Heroku上)。

我用:

创建了一个Procfile
worker: bundle exec sidekiq

如果我运行heroku ps,我看到的唯一进程是web.1

我应该看一个吗? Sidekiq?

我收到错误:

我的Heroku日志中的

Redis::CannotConnectError (Error connecting to Redis on localhost:6379)

更新:发现我可能需要heroku addons:add redistogo。还是行不通。我觉得我缺少一些基本配置。

为了让我的Heroku应用程序启动并运行Redis,我需要做些什么吗?

我一直在使用Redis / Sidekiq大约一天,所以这对我来说是新的。

谢谢!

格雷格

7 个答案:

答案 0 :(得分:51)

对于Sidekiq,你不需要Heroku的任何配置,只需添加 RedisToGo 插件即可开启。 不要忘记在Heroku配置中将至少1个 worker 归因于您的应用。

这是我的默认Procfile:

web: bundle exec thin start -p $PORT
worker: bundle exec sidekiq -c 5 -v

答案 1 :(得分:35)

值得检查sidekiq进程是否真的使用此命令启动:

heroku ps

如果没有工作人员,则可能需要运行此命令:

heroku ps:scale worker+1

事实证明,网络用户界面中存在一个错误,即一些团队成员不允许将工作人员数量从0增加到1,即使用户界面似乎显示了这一点!

答案 2 :(得分:15)

从sidekiq 3.0版开始,还有一个额外的步骤,在控制台中运行heroku config:set REDIS_PROVIDER=REDISTOGO_URL

以下是我用于Rails 4的过程:

在控制台中:

heroku addons:create redistogo
heroku config:set REDIS_PROVIDER=REDISTOGO_URL

Procfile我添加了:

worker: bundle exec sidekiq

gemfile.rb我添加了:

gem 'redis'

我添加了以下文件config/initializers/redis.rb

uri = ENV["REDISTOGO_URL"] || "redis://localhost:6379/"
REDIS = Redis.new(:url => uri)

以下是sidekiq文档的link

答案 3 :(得分:1)

听起来你几乎就在那里。您可能只需要在heroku config上设置REDISTOGO_URL?

heroku config 

应该显示redistogo值吗?

如果你把它复制到REDISTOGO_URL那么sidekiq应该有效吗?

heroku config:add REDISTOGO_URL=<redistogo value>

修改 的 Sidekiq目前将使用以下任何一种:https://github.com/mperham/sidekiq/blob/master/lib/sidekiq/redis_connection.rb#L29-L33

EDIT2: 的 Greg是正确的,如果您使用的是RedisToGo,则无需添加配置。但是如果您使用的是OpenRedis或其他Redis提供商,则需要为Sidekiq添加REDISTOGO_URL

答案 4 :(得分:1)

您当然可以在当前的工作队列中运行sidekiq。

我们的Procfile目前看起来像这样:

web: bundle exec thin start -R config.ru -e $RAILS_ENV -p $PORT
worker:  bundle exec rake jobs:work
sidekiq: bundle exec sidekiq -c 5 -v

答案 5 :(得分:1)

我发现你必须手动缩放过程:

heroku ps:scale worker+1

因为我的Procfile说:

,没有任何意义
web: bundle exec....
worker: bundle exec sidekiq

......人们会期望Heroku自动启动工作人员。最后,我没有必要扩展网络流程...

此外,您可能遇到此问题:     worker:捆绑exec sidekiq

为concurency添加标志:

worker: bundle exec sidekiq -c 5 -v

答案 6 :(得分:0)

补充gdurelle答案:

您确实需要在Heroku中为Sidekiq进行一些配置:

1)在我的情况下,已安装Sidekiq和Redis宝石(在gemfile中并捆绑在一起):

宝石文件

gem 'redis', '~> 3.1'
gem 'sidekiq', '~> 2.7', '>= 2.7.1'

2)添加一个工作程序,如果您在本地没有创建任何工作程序,我建议您至少创建一个工作程序,以防万一,请使用此操作:

rails g sidekiq:worker Hard # will create app/workers/hard_worker.rb

应创建以下内容:

app / workers / hard_worker.rb

class HardWorker
  include Sidekiq::Worker
  def perform(name, count)
    # do something
  end
end

3)添加Redis插件(在我的案例中是Heroku Redis):

heroku addons:create heroku-redis:hobby-dev

4)以我的情况添加您的redis.rb文件:

config / initializers / redis.rb

$redis = Redis.new(url: ENV["REDIS_URL"])

5)添加Procfile或config / sidekiq.yml或两者,这是我的:

Procfile

worker: bundle exec sidekiq -c 1 -q default -q mailers 

您可以通过将其粘贴到终端中来轻松创建

echo "worker: bundle exec sidekiq -c 1 -q default -q mailers" > Procfile

config / sidekiq.yml

:concurrency: 1
:queues:
  - [mailers, 7]
  - [default, 5]

6)最重要的部分转到here 并为您的工作人员打开开关,单击铅笔,然后打开缺少的开关。事情现在应该会很好,祝你有美好的一天!