Rails Resque ワーカーが PGError で失敗します。サーバーが予期せず接続を閉じました

StackOverflow https://stackoverflow.com/questions/2611747

質問

Ubuntu 9.10、Rails 2.3.4、ruby-ee 2010.01、PostgreSQL 8.4.2上で、railsアプリケーションとresqueワーカーを本番モードで実行しているサイトがあります。

ワーカーは常にエラーを発生させました。PGエラー:サーバーが予期せず接続を閉じました。

私の推測では、マスター resque プロセスがデータベースへの接続を確立していると思われます (例:authlogic は、User.acts_as_authentic を使用するときにこれを実行し、Rails アプリのクラスをロードしているときに、その接続が fork() されたプロセス (終了時?) で破損するため、次にフォークされた子は壊れたグローバル ActiveRecord::Base.connection のようなものになります。

これで非常に似た動作を再現できました サンプルコード resque worker での fork/processing を模倣します。(私の知る限り、libpq のユーザーはフォークされたプロセスで接続を再作成することを推奨しています。そうしないと安全ではありません)

しかし、奇妙なことに、直接 pgsql 接続の代わりに pgbouncer または pgpool-II を使用すると、そのようなエラーは表示されません。

したがって、問題は、プレーン接続が壊れていて接続プールで動作している理由を見つけるには、どこをどのように調査すればよいでしょうか?それとも合理的な回避策でしょうか?

役に立ちましたか?

解決

私が作成したとき ネストル, 私も同じような悩みを抱えていました。解決策は、フォークされたプロセスで接続を再確立することでした。関連するコードを参照してください。 http://github.com/francois/nestor/blob/master/lib/nestor/mappers/rails/test/unit.rb#L162

私から とても Resque コードを限定的に見てみると、#establish_connection の呼び出しはここで行うべきだと思います。 https://github.com/resque/resque/blob/master/lib/resque/worker.rb#L123

他のヒント

研究/試行錯誤のビットを行った後。同じ問題渡って来ている人のために。 gcが言及したものを明確にします。

Resque.after_fork = Proc.new { ActiveRecord::Base.establish_connection }
/lib/tasks/resque.rake

は上記のコードは、中に配置する必要があります 例えば、

require 'resque/tasks'

task "resque:setup" => :environment do
  ENV['QUEUE'] = '*'

  Resque.after_fork do |job|
    ActiveRecord::Base.establish_connection
  end

end

desc "Alias for resque:work (To run workers on Heroku)"
task "jobs:work" => "resque:work"

希望、これはそれが私のために行ったように限り、誰かを助けます。

あなたは)(フォークを越えlibpqの参照を渡すことができない(または新しいスレッドに)、あなたのアプリケーションは、さまざまな方法を矛盾でそれを使用していないのは非常に近い世話をしていない限り。 (同様に、それを使用するすべての単一の試みの周りにミューテックス、あなたはそれを閉じてはいけません)。これは、直接接続とpgbouncerを使用して、両方で同じです。それはpgbouncerで働いていた場合は、それが何らかの理由で競合条件が欠落して純粋な運だった、そして最終的に破損します。

あなたのプログラムが使用するフォークした場合、は、接続を作成する必要があります。の後にのフォークます。

変更Apacheの設定および追加

PassengerSpawnMethod conservative

私は自分のメーラーのすべてのクラスで、この問題を持っていたし、私が作った接続を確保するために、メーラーメソッド内ActiveRecord::Base.verify_active_connections!を呼び出すために必要な。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top