Соединение с Redis отклонено через рабочего демона ruby ​​​​на Heroku

Приложение Rails 3.2.6, работающее как «веб-процесс» Heroku, подключается к Redis с помощью переменной среды ENV["REDISTOGO_URL"]:

irb(main):002:0> Redis.current
=> #<Redis client v2.2.2 connected to redis://xxx.redistogo.com:1234/0 (Redis v2.4.11)>

----- /инициализаторы/redis.rb

if Rails.env.development?
  Redis.current = Redis.new
elsif Rails.env.test?
  Redis.current = Redis.new
elsif Rails.env.production?
  uri = URI.parse(ENV["REDISTOGO_URL"])
  Redis.current = Redis.new(:host => uri.host, :port => uri.port, :password => uri.password)
end

Процесс потоковой передачи демона ruby ​​работает как вторичный рабочий процесс:

----- Профайл

web: bundle exec rails server thin -p $PORT -e $RACK_ENV
worker: bundle exec rake jobs:work
streaming: RAILS_ENV=production ruby bin/streaming.rb start

Однако процесс потоковой передачи дает сбой, когда он вызывает методы в основном приложении Rails, которые соединяются с Redis, даже несмотря на то, что процесс потоковой передачи должен загружать тот же инициализатор redis.rb, что и процесс веб-приложения Rails.

----- /bin/streaming_ctl.rb

# encoding: UTF-8

require "rubygems"
require "bundler/setup"
require "daemons"

Daemons.run(File.expand_path("../streaming.rb", __FILE__))

----- /bin/streaming.rb

# encoding: UTF-8

# TODO: set rails env in init script
ENV["RAILS_ENV"] ||= "production"

# load rails environment
require File.expand_path('../../config/environment', __FILE__)

logger = ActiveSupport::BufferedLogger.new(File.expand_path("./../../log/streaming.log", __FILE__))

Streaming.start
logger.info("\nStarting streaming in #{Rails.env.to_s} mode.")

Почему потоковый процесс/рабочий процесс использует хост и порт Redis по умолчанию?

[streaming.1]: /app/vendor/bundle/ruby/1.9.1/gems/redis-2.2.2/lib/redis/client.rb:236:in `rescue in establish_connection': Connection refused - Unable to connect to Redis on 127.0.0.1:6379 (Errno::ECONNREFUSED)

person Neil    schedule 10.07.2012    source источник


Ответы (1)


Переход с «Redis.current» в /initializer/redis.rb и использование вместо этого соглашения о переменной «$redis» (как показано здесь http://jimneath.org/2011/03/24/using-redis-with-ruby-on-rails.html) исправлено проблема с подключением.

В то время приложение использовало Redis Gem версии 2.2.2. Похоже, что Redis.current в этой версии gem не будет согласованным между «сетевыми» и «рабочими» процессами, потому что Heroku запускает эти процессы в отдельных потоках. Документация по репозиторию gem предполагает, что обновление gem до >= версии 3 позволит Redis.current работать в многопоточных средах:

https://github.com/redis/redis-rb/blob/master/CHANGELOG.md#300

person Neil    schedule 12.07.2012