私はRails3.1アプリを持っています。これは、ShopifyAPIgemを利用してActiveResourceを介して外部データをフェッチします。これらのActiveRecordモデルオブジェクトをDalli経由で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
これはすべての読み取りで発生するわけではありませんが、定期的に大きな問題になるほどです。これは、複数の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)を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.rbrequire_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であるためです。
何か案は?ありがとう :)