2

我有一个 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

有任何想法吗?谢谢 :)

4

0 回答 0