我在使用Heroku部署的Rails应用程序启动并运行Sidekiq时出现问题。我的应用程序在开发中运行良好(在没有Sidekiq的Heroku上)。
我用:
创建了一个Procfileworker: 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大约一天,所以这对我来说是新的。
谢谢!
格雷格
答案 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: 并为您的工作人员打开开关,单击铅笔,然后打开缺少的开关。事情现在应该会很好,祝你有美好的一天!