我在MRI 1.9.3下运行Sidekiq,并使用MongoMapper作为我的ORM。
我的Sidekiq工人经常死于以下例外:
Mongo::ConnectionTimeoutError: could not obtain connection within 15.0 seconds.
The max pool size is currently 40; consider increasing the pool size or timeout.
Sidekiq配置为以30的并发级别运行。
正如你所看到的,我已经将我的Mongo连接池设置为40,超时时间为15秒,认为应该为我所有活动的Sidekiq线程提供足够多的mongo连接。
然而,这种异常经常发生,特别是当活跃工人的数量接近最大值时。
我在Sidekiq wiki上看到过关于Mongoid的一些提及:https://github.com/mperham/sidekiq/wiki/Problems-and-Troubleshooting#too-many-connections-to-mongodb
然而,Mongoid使用MongoMapper的不同mongo驱动程序,所以kiqstand中间件没有帮助。
MongoMapper使用官方的mongo驱动程序,它应该是线程安全的,并使用连接池。
在线程完成时,Sidekiq服务器中间件需要发生什么才能释放MongoMapper连接?