【问题标题】:Question about mongodb capped collections + tailable cursors关于mongodb capped collections + tailable cursors的问题
【发布时间】:2011-11-24 10:02:55
【问题描述】:

我正在构建一个队列系统,它通过在 mongodb 中使用 capped_collections 和可尾游标实现的堆栈将消息从一个进程传递到另一个进程。

接收进程无限循环在 capped_collection 中寻找新文档,找到后执行操作。

我的问题是,如果我实现多个接收进程,是否有办法保证新文档只能由使用可尾光标的进程之一读取一次?目标是避免在有两个接收进程在队列中寻找新消息时执行两次操作。我对 mongodb 编程比较陌生,所以我仍然对它的所有功能有所了解。

【问题讨论】:

    标签: multithreading mongodb multiprocessing database


    【解决方案1】:

    MongoDB documents 包含对实现原子更新方法的详尽描述。您无法确保只有一个进程接收到新文档,但您可以在收到新文档后实施原子更新,以确保只有一个进程对其进行操作。

    【讨论】:

    • 问题是关于确保两个相互竞争的可尾游标永远不会收到相同的消息。我看不出这与原子更新或您提供的文档链接有什么关系
    • 您因为不理解接受的答案而投了反对票?也许不明白如何使用原子更新来“避免操作被执行两次”,但提出问题的人显然做到了。不错。
    • 我理解这个问题和你的答案。原子更新不会“保证一个新文档将只被一个使用可尾光标的进程读取一次”,因为两个消费者收到相同的文档。他们在收到重复的尾部文档后如何协调完全是另一回事,也许原子更新可能会以某种方式参与。被接受的答案这一事实对于它是否是正确的答案并不重要。
    • “目标是避免操作被执行两次” 就是问题所说的。避免阅读两次是实现这一目标的一种方法(也有人问过),但由于这是不可能的,因此原子更新是实现目标所需的技术。如果您有更好的答案,请发布。
    • 可能是问题所说的,但这不是问题,这就是为什么我对你的答案投了反对票 - 只是为了子孙后代,真的没有任何个人问题。我没有更好的答案,否则我肯定会发布它。
    【解决方案2】:

    我最近一直在研究这个问题,我很想知道是否有其他方法可以在不依赖原子更新的情况下拥有多个读者(消费者)。

    这就是我想出的:将你的逻辑分成两个“模块”。第一个模块将负责从可尾游标中获取新文档。第二个模块将负责处理任意文档。通过这种方式,您可以只让一个消费者(模块一)获取文档,然后将文档发送给多个文档工作者(第二个模块)。

    这两个模块都可以在不同的进程甚至不同的语言中实现。例如,Node.js 应用程序可能会获取文档并将它们发送到用 Python 编写的脚本池,以便同时处理文档。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-04
      • 2018-01-31
      • 2014-09-11
      • 2011-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多