我最近使用 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 就不够用了。
有高手指点不?有解决方法吗?