7

sidekiq に問題があります。基本的にNameError: uninitialized constant、多数のジョブが失敗する原因となっている sidekiq セットアップを開始しています。

エラーログには次のように書かれています:

NameError: uninitialized constant GameUser::Lock
/data/@myapp/releases/20130321230952/app/models/game_user.rb:71:in `node_calls_base_get_user'
/data/@myapp/shared/bundled_gems/ruby/1.9.1/gems/sidekiq-2.8.0/lib/sidekiq/processor.rb:45:in `block (3 levels) in process'
/data/@myapp/shared/bundled_gems/ruby/1.9.1/gems/sidekiq-2.8.0/lib/sidekiq/middleware/chain.rb:109:in `call'

コードは次のとおりです。

# app/models/game_user.rb
def self.node_calls_base_get_user(serial, game_name)
  if Lock.get("user:#{id}") # Set up lock to prevent multiple users to be created      
    Lock.delete("user:#{id}")
  end
  return false
end

ロックはライブラリで定義されています。

# lib/lock.rb
class Lock
  def self.get(key)
    lock = CACHE.add("lock:#{key}", 1, 5) # Let lock autoexpire after 5 seconds
    return true
  end
end

lib/ フォルダーには、残りの構成が自動的に読み込まれます。

module Myapp
  class Application < Rails::Application
    ...
    # Custom directories with classes and modules you want to be autoloadable.
    config.autoload_paths += %W(#{config.root}/lib)
    ...    
  end
end

なぜこれが起こっているのか分かりません。展開するときはより頻繁に発生するようですが、それ以外の場合は十分に頻繁に発生するようです.

私は次のスレッドをフォローしてきました: https://github.com/mperham/sidekiq/issues/331しかし、lib フォルダーを autoload_paths に追加する以外に解決策を提供していないようです。

私は使用しています:

gem 'rails', '3.2.13' gem 'sidekiq', '>= 2.7.5'

どんな助けでも大歓迎です。

4

2 に答える 2

0

ここでの問題は、上記のロード パスである可能性が高いと思います。

注 - Rails は開発モード以外ではこれを無視するため、autoload_paths オプションが必要かどうかはわかりません。

とにかく - 私は同様の問題を抱えていました:私のコードは更新されましたが、ジョブは古いバージョンのコードを呼び出そうとし続けました。

私は最終的に、年配の労働者が走っていることに気づきました。スタック トレースで sidekiq gem のバージョンが 2.15.0 で、2.17.0 に更新されていることがわかったので気付きました

他のプロセスを強制終了しましたが、正常に機能しました

于 2013-12-13T14:49:36.700 に答える