【问题标题】:Querying delayed_jobs in Mongo blocks while map reduce is running在 map reduce 运行时查询 Mongo 块中的延迟作业
【发布时间】:2013-07-31 21:47:54
【问题描述】:

我正在使用Ruby 的delayed_job_mongoid gem 在后台排队一些map/reduce 作业。作业流程很好,大约一分钟就完成了。

现在我正在尝试在处理作业时查询它们的状态,但我发现在 map/reduce 运行时我在延迟作业表上执行的任何查询都挂在那里,直到所有的作业已完成。

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

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

【问题讨论】:

    标签: ruby mongodb mapreduce mongoid delayed-job


    【解决方案1】:

    这实际上是目前 MongoDB 的 map reduce 工作方式的一个限制。目前,MongoDB 仍然有 DB 级别的锁定和 map reduce 作业,特别是会同时取出读写锁,除非该作业是明确非原子的。

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

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

    MongoDB 的 aggregation framework 通常比 map reduce 的性能要好一些。然而,它是相当新的,它还不能完全完成所有相同的事情。如果您可以通过聚合框架完成相同的任务,我建议您改用它。

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

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

    【讨论】:

      猜你喜欢
      • 2015-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多