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 之外,它似乎没有提供解决方案。

我正在使用:

宝石'rails','3.2.13'宝石'sidekiq','> = 2.7.5'

任何帮助将不胜感激。

4

2 回答 2

10

lib将文件夹添加到eager_load_paths. 这与autoload_paths. Sidekiq 不会即时加载类,这就是为什么当您尝试访问未急切加载的常量时会出错的原因。

所以在你的 application.rb

config.autoload_paths += %W(#{config.root}/lib)
config.eager_load_paths += %W(#{config.root}/lib)
于 2013-04-02T13:08:39.600 回答
0

我认为这里的问题很可能是如上所述的加载路径。

注意 - 我不确定是否需要 autoload_paths 选项,因为 Rails 在开发模式之外会忽略此选项

无论如何-我遇到了类似的问题:尽管我的代码已更新,但该工作一直在尝试调用旧版本的代码。

我最终发现有一些老工人正在运行。我只注意到,因为堆栈跟踪显示 sidekiq gem 版本是 2.15.0,我更新了 2.17.0

我杀死了其他进程,它工作正常

于 2013-12-13T14:49:36.700 回答