Rails: 在Heroku上启动Sidekiq

54

我在我的Heroku部署的Rails应用中遇到了启动Sidekiq的问题。在本地开发环境(以及没有使用Sidekiq的Heroku上),我的应用程序可以正常工作。

我创建了一个包含以下内容的Procfile:

worker: bundle exec sidekiq
如果我运行heroku ps,我只能看到一个进程,那就是web.1
对于Sidekiq,我应该会看到一个进程吗?
我确实遇到了一个错误:
我的Heroku日志中出现了Redis :: CannotConnectError(无法连接到localhost:6379上的Redis)
更新:我发现我可能需要heroku addons:add redistogo。但仍然不起作用。我感觉我缺少一些基本配置。
为了让我的Heroku应用程序正常使用Redis,我需要做些什么吗?
我使用Redis/Sidekiq已经有一天了,所以这对我来说是新的。
谢谢!
Greg
7个回答

65

在Heroku上使用Sidekiq,您不需要任何配置,只需添加RedisToGo插件即可。

不要忘记在Heroku配置中为您的应用程序分配至少1个worker

这是我的默认Procfile:

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

1
是的...正是缺失的工作线程让我卡住了。谢谢您的回复!顺便问一下,为什么您使用“thin”?谢谢! - Greg Rogers
3
请解释一下"-c 5 -v"这两个选项的含义。 - Uri Klar
13
您应该阅读文档,真的。 c:并发性,v:详细模式,p:端口。 - gdurelle
10
实际文档在部署部分没有显示这一点。总体上,文档非常零散,很容易忽略信息。 - Andrew Kostka
1
我只能通过 bundle exec sidekiq -h 访问选项帮助。不确定是否有其他参考资料可以确定并发设置。 - Clam
显示剩余5条评论

51

检查一下这个命令是否真正启动了 Sidekiq 进程。

heroku ps
如果没有工作人员,那么您可能需要运行以下命令:

heroku ps:scale worker+1

原来网页界面存在一个bug,导致一些团队成员无法将工人数量从0增加到1,尽管UI似乎显示可以这样做!


1
这就是四个小时的“为什么?!?1!?1?!?”的答案。谢谢。(公平地说,我还需要添加“worker: bundle exec sidekiq -c 5 -v”,但你知道,我已经花了四个小时做到了) - Ryan Crews

20

从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文档的链接。


8

补充gdurelle的答案:

在Heroku上使用Sidekiq需要一些配置:

1)需要安装Sidekiq和Redis gem(在gemfile中并且已经捆绑),例如:

Gemfile

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

2) 添加一个 worker,如果您没有在本地创建任何 worker,建议您至少创建一个,以防万一,请使用以下命令:

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) 最重要的部分请前往 这里 打开您的工作器按钮,点击铅笔图标,然后启动缺失的按钮。现在应该可以正常工作了,祝您有愉快的一天!


1
打开工作进程开关是解决我的问题的关键,因为我已经在 Procfile 中定义了该工作进程。谢谢! - calyxofheld
2
很高兴能帮到你,祝你有愉快的一天! - Jose Paez
天啊,我一直像个疯子一样找 Sidekiq 为什么不运行,原来开关一直是关闭的。谢谢! - Francisco Quintero
很高兴能够帮助,祝你有美好的一天,编码愉快! - Jose Paez

2
听起来你已经接近成功了。也许你只需要在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

编辑2: Greg是正确的,如果您正在使用RedisToGo,则不需要添加配置。但是,如果您正在使用OpenRedis或其他Redis提供程序,则需要为Sidekiq添加REDISTOGO_URL。


编辑 #1 不再准确。 - Terra Ashley

2
我发现你必须手动缩放进程,方法如下:
heroku ps:scale worker+1

我的Procfile文件中写着这样的内容,所以这没有任何意义:
web: bundle exec....
worker: bundle exec sidekiq

...人们本来期望Heroku会自动启动worker。最终我不需要扩展Web进程...

此外,您可能会遇到以下问题:     worker:bundle exec sidekiq

为并发添加标志:

worker: bundle exec sidekiq -c 5 -v

我曾经在Heroku Redis实例中遇到完全相同的问题。无法在Heroku仪表板上打开开关,所以这个解决方案对我有用。 - mutantkeyboard

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

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