【问题标题】:Rails: Starting Sidekiq on HerokuRails:在 Heroku 上启动 Sidekiq
【发布时间】:2012-11-26 01:57:24
【问题描述】:

我无法在 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 大约一天了,所以这对我来说是新的。

谢谢!

格雷格

【问题讨论】:

    标签: ruby-on-rails heroku sidekiq


    【解决方案1】:

    补充 gdurelle 答案:

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

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

    过程文件

    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: 并为您的工人打开开关,单击铅笔,然后打开丢失的开关。现在应该一切正常,祝您有美好的一天!

    【讨论】:

    • 打开工作开关对我来说是这样做的,因为我已经在我的 Procfile 中定义了工作人员。谢谢!
    • 我很高兴它有帮助,祝你有美好的一天!
    • 天哪,我看起来像个疯子,为什么 Sidekiq 没有运行并且开关一直处于关闭状态。谢谢!
    • 总是很高兴能得到帮助,祝你有美好的一天,快乐的编码!
    【解决方案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
    

    【讨论】:

    • 我在Heroku Redis 实例上遇到了完全相同的问题。无法打开 Heroku 仪表板上的开关,所以这个解决方案对我有用。
    【解决方案3】:

    从 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

    【讨论】:

      【解决方案4】:

      您当然可以在当前作业队列旁边运行 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】:

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

        heroku ps
        

        如果没有worker,那么你可能需要运行这个命令:

        heroku ps:scale worker+1
        

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

        【讨论】:

        • 这个。这是四个小时“为什么?!?!1!?1?!?!”的答案。谢谢。 (公平地说,我还需要添加“worker: bundle exec sidekiq -c 5 -v”,但你知道,我做了四个小时)
        【解决方案6】:

        听起来你快到了。可能你只需要在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

        【讨论】:

        • Edit #1 不再准确。
        【解决方案7】:

        不,您不需要对 Sidekiq 的 Heroku 进行任何配置,只需添加 RedisToGo 插件即可。 不要忘记在您的 Heroku 配置中为您的应用分配至少 1 个 worker

        这是我的默认 Procfile:

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

        【讨论】:

        • 是的……这是我最后一次挂断电话的是失踪的工人。感谢您的答复!顺便说一句,你为什么使用“瘦”?谢谢!
        • 老项目,我要换独角兽了。如果答案帮助您点击'^'箭头投票;)++
        • 你能解释一下 -c 5 -v 选项吗?
        • c:并发,v:详细,p:端口。您应该阅读文档。真的。
        • @gdurelle 实际文档没有在部署部分显示这一点。一般来说,文档非常分散,很容易遗漏信息。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-18
        • 2015-07-13
        • 1970-01-01
        • 2020-01-19
        • 2014-07-23
        相关资源
        最近更新 更多