gpt4 book ai didi

mysql - 在 fork /线程应用程序中运行时,ActiveRecord 无法重新连接?

转载 作者:可可西里 更新时间:2023-11-01 07:04:51 25 4
gpt4 key购买 nike

这里有点开放式问题,所以我先概述一下问题。我们有一个 Resque应该从队列中弹出数据同步作业的工作人员,原因有两个,使用 Cron(并一遍又一遍地支付 Rails 环境启动时间)很糟糕,以及替代队列,Github 做了一个很好的例子当他们反对他们时announced Resque .此外,Redis 时间序列功能已经在我们的基础架构中发挥了重要作用,我们还将 TS 数据洗牌到 RRDTool 等...

这就是问题所在,作业之间通常间隔三个小时(但工作人员可以随时安排作业……因此需要排队),PostgreSQL 服务器消失了。很容易治愈,我希望在相应的环境下设置 reconnect: true 将确保它按预期工作。我在 few 中读到places reconnect: true 不适用于使用 fork() 的应用程序。其中,自然Resque确实如此,首先是它的工作人员……我不明白的部分是为什么 ActiveRecord 的重新连接在这些情况下无法工作?

我注意到 reconnect! MySQL Adapter 的实现和 PostgreSQL Adapter在 ActiveRecord 中是不同的……但无论哪种方式,我都希望 ActiveRecord reconnect: true 配置能够工作。

The problem seems to be clear enough, when the child process exists, it closes the file handles created by the parent (thus hanging up the connection to the database) - is it possible to close a filehandle in such a way that ActiveRecord doesn't recognise that the connection has been terminated?

还有一个ActiveRecord aware fork(),就其值(value)而言,我能够在 Github 上找到它,作为一个馅饼 - 它未经测试,但我认为它有效(尚未在当前的 Rails 上尝试过..)

我的问题更多,如果您fork(),为什么 AR 中的自动重新连接不能工作?(而且,后来 - 我不能是唯一的遇到这个问题的人;我把它归结为将 PGSQL 与 Resque 一起使用!)

最佳答案

虽然不完全是“为什么不能重新连接”的答案,但我认为可以帮助您的是以下代码放在初始化阶段的某处:


Resque.after_fork do |job|
ActiveRecord::Base.connection.reconnect!
end

更新:关于重新连接——这似乎是 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 连接 fork 进程会导致不可预测的结果”- http://www.postgresql.org/docs/9.0/interactive/libpq-connect.html而且很明显,C 驱动程序不提供任何重新连接功能。

关于mysql - 在 fork /线程应用程序中运行时,ActiveRecord 无法重新连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5477917/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com