51

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

我创建了一个 Procfile:

worker: bundle exec sidekiq

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

我应该为 Sidekiq 看一个吗?

我确实收到一个错误:

Redis::CannotConnectError (Error connecting to Redis on localhost:6379)在我的 Heroku 日志中。

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

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

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

谢谢!

格雷格

4

7 回答 7

63

不,你不需要对 Sidekiq 的 Heroku 进行任何配置,只需添加RedisToGo插件就可以了。不要忘记在您的 Heroku 配置中将至少 1 个工作人员分配给您的应用程序。

这是我的默认 Procfile:

web: bundle exec thin start -p $PORT
worker: bundle exec sidekiq -c 5 -v
于 2012-12-19T09:04:46.403 回答
46

值得检查一下 sidekiq 进程是否真的是用这个命令启动的:

heroku ps

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

heroku ps:scale worker+1

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

于 2013-08-23T22:48:45.757 回答
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 文档的链接。

于 2015-07-03T21:58:31.910 回答
8

补充 gdurelle 答案:

您确实需要使用 Heroku 为 Sidekiq 进行一些配置:

1)在我的情况下,安装 Sidekiq 和 Redis gem(在 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

应该创建这个:

应用程序/工人/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 文件,在我的例子中:

配置/初始化程序/redis.rb

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

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

档案

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

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

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

配置/sidekiq.yml

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

6)最重要的部分在这里 打开你的工人的开关,点击铅笔,然后打开丢失的开关。现在应该一切正常,祝您有美好的一天!

于 2019-05-30T17:16:41.023 回答
2

我发现您必须像这样手动扩展流程:

heroku ps:scale worker+1

没有意义,因为我的 Procfile 说:

web: bundle exec....
worker: bundle exec sidekiq

...人们会期望 Heroku 自动启动工作程序。最后,我不必扩展 Web 流程......

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

为并发添加标志:

worker: bundle exec sidekiq -c 5 -v
于 2016-11-06T12:43:20.997 回答
1

听起来你快到了。可能您只需要在heroku 配置上设置 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

于 2012-12-07T23:11:00.660 回答
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
于 2014-09-19T16:10:21.937 回答