Lee*_*ley 5 ruby mysql postgresql activerecord resque
这里有一个开放式问题,所以我先概述一下这个问题.我们有一个Resque工作者应该从队列中弹出数据同步作业,原因是双重的,使用Cron(并且支持Rails环境引导时间一遍又一遍)很糟糕,以及替代队列,Github做的很好当他们宣布Resque时,他们是一个非常好的案例.此外,Redis时间序列功能已经成为我们基础设施的重要组成部分,我们还将TS数据混合到RRDTool等中......
这是问题,工作之间通常有三个小时(但工作人员可以随时安排工作......因此队列),PostgreSQL服务器消失了.足够容易治愈,我预计,设置reconnect: true相应的环境下,将确保这一预期一样.我在读一些 地方是reconnect: true不会为使用应用程序的工作fork().当然,Resque确实会启动它的工作人员...我不明白的部分是为什么ActiveRecord的重新连接在这些情况下无法工作?
我注意到的实现reconnect!了MySQL的适配器和PostgreSQL的适配器中的ActiveRecord是不同的......但无论哪种方式,我希望ActiveRecord的reconnect: true配置工作.
这个问题似乎很清楚,当子进程存在时,它会关闭父进程创建的文件句柄(从而挂断与数据库的连接) - 是否有可能以ActiveRecord不这样的方式关闭文件句柄认识到连接已经终止?
还有,值得一提的是,我能够在Github上找到一个ActiveRecord感知的fork()作为一个牧师 - 它没有经过测试,但我认为它有效(没有用当前的Rails试过......)
我的问题是,为什么不能自动重新连接AR工作如果你fork()?(而且,后来 - 我不能成为唯一一个遇到这个问题的人;我正在将它用于使用带有Resque的PGSQL!)
虽然不完全是"为什么它不能重新连接"的答案,但我认为可以帮助你的是以下代码放在初始化阶段的某个地方:
Resque.after_fork do |job|
ActiveRecord::Base.connection.reconnect!
end
Run Code Online (Sandbox Code Playgroud)
更新:关于重新连接 - 它似乎只是MySQL的功能.这是它在mysql适配器中使用的方式:https: //github.com/rails/rails/blob/master/activerecord/lib/active_record/connection_adapters/mysql_adapter.rb#L848 如您所见,它使用底层驱动程序的重新连接功能. https://github.com/kwatch/mysql-ruby/blob/master/ext/mysql.c#L923
另一方面,postgresql适配器对reconnect选项没有任何作用,你可以看到https://github.com/rails/rails/blob/master/activerecord/lib/active_record/connection_adapters/postgresql_adapter.rb
此外,PostgreSQL网站明确表示"使用开放的libpq连接分叉进程可能会导致不可预测的结果" - http://www.postgresql.org/docs/9.0/interactive/libpq-connect.html 而且它也很明显C驱动程序不提供任何重新连接功能.
| 归档时间: |
|
| 查看次数: |
2770 次 |
| 最近记录: |