我有一个Rails 3.1应用程序,它利用Shopify API gem通过ActiveResource获取一些外部数据。我们通过Dalli将这些ActiveRecord模型对象存储在Memcached中,然后在需要时再次读入。
我们可以在运行Thin Web服务器时成功读取这些数据,一切正常。但是,一旦我将Unicorn设置为Web服务器,那么当从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'starnify_api':
require 'current_shop_detail'
class ApplicationController < ActionController::Base
protect_from_forgery
include CurrentShopDetail
require_dependency 'shopify_api'
end
但我不确定这是否是执行require_dependency的正确方法,因为缺少的类是:ShopifyAPI :: Order :: ClientDetails
有什么想法吗?谢谢:))