我有一个 Rails 3.1 应用程序,它利用 Shopify API gem 通过 ActiveResource 获取一些外部数据。我们通过 Dalli 将这些 ActiveRecord 模型对象存储在 Memcached 中,然后在需要时再次读取。
我们可以在运行 Thin webserver 时成功读取这些数据,并且一切正常。但是,一旦我将 Unicorn 设置为网络服务器,从 Memcached 读取模型对象时,我会继续收到以下错误:
Cache read: shopcache_987102
DalliError: Unable to unmarshal value: undefined class/module ShopifyAPI::Order::ClientDetails
Completed 500 Internal Server Error in 395ms
这不会在每次阅读时都发生,但经常会成为一个大问题。只有当我们产生超过 1 个 Unicorn 工作进程时才会发生这种情况。
下面是我的 unicorn.rb 文件:
worker_processes 3
timeout 30
preload_app true
after_fork do |server, worker|
#Re-connect to ActiveRecord
if defined?(ActiveRecord::Base)
ActiveRecord::Base.establish_connection
Rails.logger.info('Connected to ActiveRecord')
end
end
我们还激活了以下功能:
config.cache_classes = true
如果我只生成一个 Unicorn worker_process (worker_processes 1),那么一切正常。我试过设置 config.threadsafe!在 application.rb 中,这对多个工人没有帮助。
似乎不需要所需的类/模块,我不知道为什么。
编辑:我还在我的 applicaton.rb 文件中添加了以下内容,以尝试将 gem 添加到 rails 的自动加载路径,但没有成功:
# Custom directories with classes and modules you want to be autoloadable.
# config.autoload_paths += %W(#{config.root}/extras)
config.autoload_paths += %W(#{config.root}/lib)
config.autoload_paths += Dir["#{config.root}/lib/**/"]
我还像这样添加到 application_controller.rb require_dependency 'shopify_api' :
require 'current_shop_detail'
class ApplicationController < ActionController::Base
protect_from_forgery
include CurrentShopDetail
require_dependency 'shopify_api'
end
但我不确定这是否是执行 require_dependency 的正确方法,因为缺少的类是:ShopifyAPI::Order::ClientDetails
有任何想法吗?谢谢 :)