【问题标题】:Sidekiq generating errors on startup : Error fetching message: Invalid argument - connect(2)Sidekiq 在启动时生成错误:错误获取消息:无效参数 - 连接(2)
【发布时间】:2014-05-04 12:24:56
【问题描述】:

嗨 sidekiq / ruby​​ / redis 专家:

我不确定这个问题是否与 sidekiq、redis、ruby 甚至 rails 有关。

我们正在尝试在我们的开发服务器上启动 sidekiq(实际上距离 prod 一步之遥,因此我们在 prod 模式下使用 rails),并且 sidekiq 日志不断产生错误消息:

获取消息时出错:参数无效 - connect(2)

日志的相关部分如下:

# Logfile created on 2014-04-30 15:57:05 -0400 by logger.rb/31641
Running in ruby 1.9.3p484 (2013-11-22) [i386-mingw32]
See LICENSE and the LGPL-3.0 for licensing details.
Starting processing, hit Ctrl-C to stop
{:queues=>["default"], :concurrency=>25, :require=>".", :environment=>"production", :timeout=>8, :error_handlers=>[#<Sidekiq::ExceptionHandler::Logger:0xef8410>], :lifecycle_events=>{:startup=>[], :quiet=>[], :shutdown=>[]}, :strict=>true, :tag=>"price_tracker_rewrite"}
Booting Sidekiq 3.0.0 with redis options {}
Error fetching message: Invalid argument - connect(2)
E:/Rewrite/Ruby193/lib/ruby/gems/1.9.1/gems/redis-3.0.7/lib/redis/connection/ruby.rb:129:in `connect_nonblock'
E:/Rewrite/Ruby193/lib/ruby/gems/1.9.1/gems/redis-3.0.7/lib/redis/connection/ruby.rb:129:in `rescue in connect_addrinfo'
E:/Rewrite/Ruby193/lib/ruby/gems/1.9.1/gems/redis-3.0.7/lib/redis/connection/ruby.rb:121:in `connect_addrinfo'
E:/Rewrite/Ruby193/lib/ruby/gems/1.9.1/gems/redis-3.0.7/lib/redis/connection/ruby.rb:162:in `block in connect'
E:/Rewrite/Ruby193/lib/ruby/gems/1.9.1/gems/redis-3.0.7/lib/redis/connection/ruby.rb:160:in `each'
E:/Rewrite/Ruby193/lib/ruby/gems/1.9.1/gems/redis-3.0.7/lib/redis/connection/ruby.rb:160:in `each_with_index'
E:/Rewrite/Ruby193/lib/ruby/gems/1.9.1/gems/redis-3.0.7/lib/redis/connection/ruby.rb:160:in `connect'
E:/Rewrite/Ruby193/lib/ruby/gems/1.9.1/gems/redis-3.0.7/lib/redis/connection/ruby.rb:211:in `connect'
E:/Rewrite/Ruby193/lib/ruby/gems/1.9.1/gems/redis-3.0.7/lib/redis/client.rb:285:in `establish_connection'
E:/Rewrite/Ruby193/lib/ruby/gems/1.9.1/gems/redis-3.0.7/lib/redis/client.rb:79:in `block in connect'
E:/Rewrite/Ruby193/lib/ruby/gems/1.9.1/gems/redis-3.0.7/lib/redis/client.rb:257:in `with_reconnect'
E:/Rewrite/Ruby193/lib/ruby/gems/1.9.1/gems/redis-3.0.7/lib/redis/client.rb:78:in `connect'
E:/Rewrite/Ruby193/lib/ruby/gems/1.9.1/gems/redis-3.0.7/lib/redis/client.rb:240:in `with_socket_timeout'
E:/Rewrite/Ruby193/lib/ruby/gems/1.9.1/gems/redis-3.0.7/lib/redis/client.rb:178:in `call_with_timeout'
E:/Rewrite/Ruby193/lib/ruby/gems/1.9.1/gems/redis-3.0.7/lib/redis.rb:1038:in `block in _bpop'
E:/Rewrite/Ruby193/lib/ruby/gems/1.9.1/gems/redis-3.0.7/lib/redis.rb:37:in `block in synchronize'
E:/Rewrite/Ruby193/lib/ruby/1.9.1/monitor.rb:211:in `mon_synchronize'
E:/Rewrite/Ruby193/lib/ruby/gems/1.9.1/gems/redis-3.0.7/lib/redis.rb:37:in `synchronize'
E:/Rewrite/Ruby193/lib/ruby/gems/1.9.1/gems/redis-3.0.7/lib/redis.rb:1035:in `_bpop'
E:/Rewrite/Ruby193/lib/ruby/gems/1.9.1/gems/redis-3.0.7/lib/redis.rb:1080:in `brpop'
E:/Rewrite/Ruby193/lib/ruby/gems/1.9.1/gems/sidekiq-3.0.0/lib/sidekiq/fetch.rb:101:in `block in retrieve_work'
E:/Rewrite/Ruby193/lib/ruby/gems/1.9.1/gems/connection_pool-2.0.0/lib/connection_pool.rb:58:in `with'
E:/Rewrite/Ruby193/lib/ruby/gems/1.9.1/gems/sidekiq-3.0.0/lib/sidekiq.rb:69:in `redis'
E:/Rewrite/Ruby193/lib/ruby/gems/1.9.1/gems/sidekiq-3.0.0/lib/sidekiq/fetch.rb:101:in `retrieve_work'
E:/Rewrite/Ruby193/lib/ruby/gems/1.9.1/gems/sidekiq-3.0.0/lib/sidekiq/fetch.rb:36:in `block in fetch'
E:/Rewrite/Ruby193/lib/ruby/gems/1.9.1/gems/sidekiq-3.0.0/lib/sidekiq/util.rb:15:in `watchdog'
E:/Rewrite/Ruby193/lib/ruby/gems/1.9.1/gems/sidekiq-3.0.0/lib/sidekiq/fetch.rb:32:in `fetch'
E:/Rewrite/Ruby193/lib/ruby/gems/1.9.1/gems/celluloid-0.15.2/lib/celluloid/calls.rb:25:in `public_send'
E:/Rewrite/Ruby193/lib/ruby/gems/1.9.1/gems/celluloid-0.15.2/lib/celluloid/calls.rb:25:in `dispatch'
E:/Rewrite/Ruby193/lib/ruby/gems/1.9.1/gems/celluloid-0.15.2/lib/celluloid/calls.rb:122:in `dispatch'
E:/Rewrite/Ruby193/lib/ruby/gems/1.9.1/gems/celluloid-0.15.2/lib/celluloid/actor.rb:322:in `block in handle_message'
E:/Rewrite/Ruby193/lib/ruby/gems/1.9.1/gems/celluloid-0.15.2/lib/celluloid/actor.rb:416:in `block in task'
E:/Rewrite/Ruby193/lib/ruby/gems/1.9.1/gems/celluloid-0.15.2/lib/celluloid/tasks.rb:55:in `block in initialize'
E:/Rewrite/Ruby193/lib/ruby/gems/1.9.1/gems/celluloid-0.15.2/lib/celluloid/tasks/task_fiber.rb:13:in `block in create'

我的同事和我真的无处可去,谷歌也没有任何帮助。感谢您的帮助!

更新:我正在使用以下行执行 sidekiq:“sidekiq -e production”,因为这本质上是我们产品的镜像。我也没有 sidekiq 配置文件(sidekiq.yml),也许我需要一个?真的不确定,但它在测试过程中对我们很有效。我们也在 Windows 环境中执行 sidekiq,以防万一。

【问题讨论】:

  • 你能提供你的sidekiq配置和你的启动线(例如bundle exec sidekiq -e ...)
  • 您更新的信息没有想到,但是由于这是一个 redis 连接问题,这可能源于您的 sidekiq.rb 和 redis.rb 初始化程序。接下来我可以提供一些建议,但最好先看看这些文件。
  • @blootto 根本没有 sidekiq.rb 和 redis.rb 自定义初始化程序。我们只需启动已安装的 redis 服务器(作为服务),然后使用我上面提到的命令运行 sidekiq(开箱即用,如果你愿意的话)。在我们的测试环境中一切正常,现在它在 dev/prod 上给出了这个错误。
  • 我建议尝试使用一些初始化程序。它不会受到伤害,并且可以确保您在任何环境中对您的配置有更明显的控制。我将在答案中添加一些建议以开始

标签: ruby-on-rails ruby redis sidekiq


【解决方案1】:

首先设置一些初始化器,试试这些(注意 Heroku ENV var 可以用其他东西替换)

config/redis.rb

 module MyApp
   class << self
     def redis
       @redis ||= Redis.new(url: (ENV['REDISTOGO_URL'] || 'redis://127.0.0.1:6379'))
     end

     def sidekiq?
      begin
        redis_info = Sidekiq.redis { |conn| conn.info }
        true
      rescue
         false
       end

      end
   end
 end

config/sidekiq.rb

 Sidekiq.configure_server do |config|
   Rails.logger = Sidekiq::Logging.logger
   config.redis = { :url => MyApp.redis[:url], :namespace => 'sidekiq', :size => 5 }
 end

 Sidekiq.configure_client do |config|
   config.redis = { :url => MyApp.redis[:url], :namespace => 'sidekiq', :size => 1 }
 end

【讨论】:

    【解决方案2】:

    这看起来像是一个更基本的 Ruby/Windows 问题。如果可能的话,升级你的 MRI 版本,或者试试 JRuby。

    【讨论】:

      猜你喜欢
      • 2014-05-28
      • 1970-01-01
      • 2013-04-12
      • 2015-02-13
      • 1970-01-01
      • 2013-06-30
      • 2022-01-02
      • 1970-01-01
      • 2012-06-16
      相关资源
      最近更新 更多