2

私は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であるためです。

何か案は?ありがとう :)

4

0 に答える 0