Rails Resque工作者使用mysql失败"连接太多"

时间:2014-07-16 21:24:09

标签: mysql ruby-on-rails ruby resque

我们最近将我们的(ruby)作业排队系统从DelayedJob切换到Resque。

虽然我们的延迟已经下降,而且我们已经消除了数据库瓶颈,但我们现在看到了一个新问题;我们的一个或多个工作人员似乎在退出时保持数据库连接处于打开状态。当我们查看进程列表时,有数百个连接处于“睡眠”状态。他们最终在90秒后超时。我们一直在限制我们的员工,以避免客户端连接不畅,但我们真正需要找到的 out是当我们使用mysql2 ruby​​客户端断开连接时,我们的一个(或多个)工作没有礼貌。

我们如何能够(1)找到罪犯或(2)检测我们的代码,以便我们确保在作业终止之前确实断开连接?

  • Rails 4.0.x
  • Resque 1.25.2
  • mysql2 gem 0.3.16

2 个答案:

答案 0 :(得分:2)

确保您的Resque进程在分叉之前与数据库断开连接,然后再重新建立连接。创建初始化文件config/initializers/resque.rb  其中包含:

Resque.before_fork do
  defined?(ActiveRecord::Base) && ActiveRecord::Base.connection.disconnect!
end

Resque.after_fork do
  defined?(ActiveRecord::Base) && ActiveRecord::Base.establish_connection
end

答案 1 :(得分:0)

我放弃了Resque并搬到了Sidekiq。我现在好多了。