Tôi có thể nghĩ đến hai khả năng:
-
Có phải cài đặt gì đó không
ENV['REDIS_URL']
trước khi trình khởi tạo chạy? Ví dụ:có thể bạn có.env
tệp được kiểm tra thành git đang ghi đè biến Heroku? -
Bạn nói mã này là từ
redis.rb
. Bạn cóconfig/initializers/resque.rb
không Mà còn? Còn vềconfig/resque.yml
? Một trong hai cái đó có thể là cũng đang cố gắng mở kết nối Redis. (Nếu bạn có thể đăng toàn bộ dấu vết ngăn xếp về lỗi của mình, bạn có thể xác nhận điều này hoặc loại trừ nó.) Hay bạn đang sử dụng Redis cho bất kỳ điều gì khác ngoài Resque?
Bạn cũng có thể thực hiện một số gỡ lỗi printf và thay đổi trình khởi tạo của mình để nói:
if Rails.env.production?
puts "production: #{ENV['REDIS_URL']}"
uri = URI.parse(ENV["REDIS_URL"])
else
puts "not production"
uri = URI.parse("redis://localhost:6379")
end
Điều đó sẽ giúp bạn làm rõ những gì đang xảy ra. (Bạn có thể cần sử dụng Rails.logger.info
thay vì puts
.)
CHỈNH SỬA: Dấu vết ngăn xếp đó rất hữu ích! Chắc chắn rồi, trình khởi tạo của riêng bạn hoàn toàn không ở đó, nhưng có mã khác đang cố tải kết nối redis của chính nó, tại đây:
remote: /tmp/build_329306a238b046dda86a54d29db48f4c/vendor/bundle/ruby/2.4.0/gems/resque-web-0.0.9/config/initializers/resque_config.rb:4:in `<top (required)>'
Nếu bạn nhìn vào viên ngọc đó, bạn có thể thấy nó đang làm việc này:
require 'resque'
config = ENV.fetch("RAILS_RESQUE_REDIS", "127.0.0.1:6379")
Resque.redis = config
Vì vậy, tôi nghĩ câu trả lời là đặt RAILS_RESQUE_REDIS
ngoài ra tới REDIS_URL
. Bạn có thể sử dụng Heroku config:set
lệnh để làm điều đó.