Rails的Resque工失败,PGError:服务器意外关闭了连接
-
25-09-2019 - |
题
我已经现场运转轨道的应用和resque工人在生产模式下运行,在Ubuntu 9.10,Rails的2.3.4,红宝石-EE 2010.01,PostgreSQL的8.4.2
工人不断提高错误:PGError:服务器关闭了连接意外地
我最好的猜测是,主resque过程建立连接到分贝(例如authlogic做的是,当使用User.acts_as_authentic),而装载导轨应用的类,以及连接变得在叉损坏()ED方法(在退出?),所以接下来的分叉孩子得到一种打破全球的ActiveRecord :: Base.connection
我能再现与在resque工人处理此示例代码模仿叉/非常相似的行为。 (AFAIK,libpq的用户推荐无论如何重新创建派生进程的连接,否则这不是安全的)
不过,奇怪的是,当我使用pgbouncer或pgpool-II,而不是直接的pgsql连接,这样的错误不会出现。
那么,问题是在哪里,我应该如何挖掘,找出为什么它打破了简单的连接,并正在与连接池?或合理解决办法:
解决方案
当我创建内斯特时,我有同样的问题。解决的办法是重新建立在派生进程的连接。请参阅相关的代码在 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"
希望这可以帮助别人,尽可能多地为我做的。
您不能跨fork传递的libpq引用()(或到一个新的线程),除非你的应用需要非常密切的护理方式相互矛盾不使用它的。 (喜欢身边的每一次尝试互斥来使用它,你绝不能接近它)。这对于直接连接和使用pgbouncer相同。如果曾在pgbouncer,这是在缺少某种原因的竞争条件纯粹是运气,而最终将会被突破。
如果你的程序使用分叉,您的必须的创建连接的之后的叉。
更改Apache配置和添加
PassengerSpawnMethod conservative
我和我所有的梅勒类的这个问题,我需要,以确保作出的连接邮包方法中调用ActiveRecord::Base.verify_active_connections!
。