delayed_job mongoid ActiveRecord

博聆网原先使用了delayed_job来处理后台任务,但delayed_job使用的是mysql存储其任务,这样如果有大量小任务对数据库压力也不小,反而不能使后台处理达到减轻数据库压力的效果。

博聆的通知也是放在mysql中,由于其结构比较有弹性,而关系型数据库对松散结构的记录支持并不好,我需要使用序列化字段来保存一些信息。

所以最后打算将通知迁移到mongodb,正好delayed_job也有Mongoid的后端,这样也可以一起将delayed_job迁移过去。

在本地开发的过程中都比较顺利,然而部署到服务器上却发现delayed_job的进程不处理任务了,即便手工调用,也是找不到任务。经过反复检查,最后发现服务器端的mongodb版本太低,只有1.2,而本地开发使用的版本是2.0。

服务器上安装的是Ubuntu 10.04 Lucid,apt仓库中的mongodb版本太低,使用了10gen提供的apt源,解决了运行任务的问题。

然而接下来依然有问题,delayed_job提供的daemon脚本无法运行,会直接报错退出。然而使用rake运行则没有问题。

后来经过思考,觉得应该是delayed_job的daemon在fork的时候,rails没有对mysql的链接进行清理,导致访问mysql的时候出错。delayed_job的mongoid后端仅仅只清理了mongodb的链接,估计作者仅仅考虑了单纯使用mongodb的环境,所以我加上了一个monkey patch来解决了这个问题:

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.