在map reduce运行时,查询Mongo块中的delayed_jobs

时间:2013-07-31 21:47:54

标签: ruby mongodb mapreduce mongoid delayed-job

我正在使用Ruby的delayed_job_mongoid gem在后台排队一些map / reduce作业。工作进展顺利,大约一分钟就完成了。

现在我正在尝试在处理作业时查询作业的状态,但是我发现在map / reduce运行时我在delayed_jobs表上执行的任何查询都会挂起,阻塞直到所有工作已经完成。

因此,例如,如果我在map / reduce运行时执行db.delayed_jobs.find(),它只是坐在那里直到每个最后一个作业完成,然后它最终显示表的内容(它是空的点)。这几乎就像整个表在作业运行时被锁定一样。这不是我所期望的。

我已经检查过,我没有用完数据库连接。有谁知道发生了什么事?

1 个答案:

答案 0 :(得分:0)

这实际上限制了MongoDB的地图减少目前的工作方式。目前,MongoDB仍然具有数据库级别锁定和映射减少作业,特别是取出读取和写入锁定,除非作业明确是非原子的。

您可以阅读有关如何使mapReduce命令非原子here的更多信息(警告:这仅适用于MongoDB v2.2 +)。

  

如果 nonAtomic 为true,则后处理步骤将阻止MongoDB锁定数据库;但是,其他客户端将能够读取输出集合的中间状态。否则,map reduce操作必须在后处理期间锁定数据库。

MongoDB的aggregation framework通常比map reduce更高效。然而,它是相当新的,它还不能完全做同样的事情。如果您可以通过聚合框架完成相同的任务,我建议您使用它。

供您参考,这里列出了操作类型以及每个操作需要的锁类型:

http://docs.mongodb.org/manual/faq/concurrency/#which-operations-lock-the-database