Rails Resque工作者失败了mysql"Too many connections"

Ken*_*yer 5 ruby mysql ruby-on-rails resque

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

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

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

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

inf*_*sed 3

确保您的 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
Run Code Online (Sandbox Code Playgroud)