2011-12-06 3 views
2

Ruby on Railsと単純なスタックがあり、resqueです。私は仕事を通常の方法でエンキューしており、私は働いている労働者のプールを持っています。何も狂っていない。時々、ResqueがRails環境を「アンロード」して明白な理由がない場合

私の問題は、長い時間労働者を走らせておくと、アプリケーションのモデルの可視性が失われ、そのようなメソッドを呼び出すたびにundefined_methodが呼び出されるということです。

これは非常に奇妙です。これは数日間は完璧に動作していて、突然それが失敗し始めます。作業者を再起動すると問題は解決しますが、通常はしばらく後に復帰します。

私は何が起こっているのかわからないので、どんな指針にも大変感謝しています。

+0

あなたはその時間内にいくつかのリリースをしているの?カストストラーノは、resqueが動作しているファイル、またはそのようなものを削除していますか? – phoet

+0

@phoetそれは開発中に起こっている。私はまだ生産環境を持っていません。私はファイルを変更している可能性がありますが、作業者がロードした時点で問題になることがあります - – marcgg

+0

障害発生時のスタックトレースを投稿できますか? あなたのワーカーが、アプリケーションコードがAWOLになるのではなく、データベースとの接続を失っているように思えます。しかし、私はRails/Active Recordのユーザーではないので、わかりません。 –

答えて

2

Resqueワーカーは、新しいプロセスをフォークして作業を行います。モデルのクラスがforkされた子プロセスにロードされていない可能性があります。クラスがロードされる順序のために名前空間の衝突が発生する可能性もあります。

resqueワーカーを再起動せずに開発中のクラスファイルを変更する場合は、クラスを正しく再ロードしていない可能性があります。

クラスがプリフォークされていることを確認するには、クラスをresque setupタスクで参照してください。プリフォークされたクラスは、子プロセスにコピーされます。以下、私はそれらを強制的にロードするために配列に入れます。これはまた、各子プロセスが既にクラスをロードしているので、より高速です。また、ARを使用している場合は、After_forkブロックでActiveRecord接続を再確立する必要があります。

のlib /タスク/ resque.rake:

namespace :resque do 
    task :setup => :environment do 
    [User, Monkey, Banana] # force these classes to load 

    Resque.after_fork { ActiveRecord::Base.establish_connection } 
    end 
end 
+0

これは正確に起こったことです。ありがとうございます – marcgg

+0

なぜafter_forkでAR接続を再確立する必要がありますか? –

関連する問題