Gem 使用 Sidekiq 发生 ActiveRecord::ConnectionTimeoutError

grant · 2013年03月06日 · 最后由 yedingding 回复于 2013年03月07日 · 4196 次阅读

我最近使用 sidekiq 实现 delay 任务。

例如:一个 model 新建的时候需要下载网上的图片到本地。这个图片下载就用 sidekiq 的 worker 来做,这样新建的时候无需等待。利用 after_commit 调用这个 worker。这个 worker 里面有数据库查询的操作。

但这个项目里面有个 cron job,每晚半夜会调用一个 task,这个 task 会自动新建很多这个 model,这样的话,就会多次调用上面所说的 worker.

这时候就会发生如下错误,这个错误发生在 worker 里面用 model 查询数据的地方 (User.find(id))。

An ActiveRecord::ConnectionTimeoutError occurred in background at 2013-03-05 08:19:42 UTC :

  could not obtain a database connection within 5 seconds. The max pool size is currently 5; consider increasing it.
  /var/www/testproject/shared/bundle/ruby/1.9.1/gems/activerecord-3.2.2/lib/active_record/connection_adapters/abstract/connection_pool.rb:252:in `block (2 levels) in checkout'

我猜测原因是一个 worker 是独立的线程会占用一个 connection,一旦很多 worker 被调用,这样的话,connection 就不够用了。

有高手指点不?有解决方法吗?

database.yml 里面的 pool 适当大于 worker 的 concurrency,一般大个 5 就差不多了,准确点是 2

需要 登录 后方可回复, 如果你还没有账号请 注册新账号