Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 关于mongodb封顶集合的问题+;可裁剪游标_Multithreading_Mongodb_Multiprocessing_Database - Fatal编程技术网

Multithreading 关于mongodb封顶集合的问题+;可裁剪游标

Multithreading 关于mongodb封顶集合的问题+;可裁剪游标,multithreading,mongodb,multiprocessing,database,Multithreading,Mongodb,Multiprocessing,Database,我正在构建一个排队系统,它通过mongodb中实现的堆栈将消息从一个进程传递到另一个进程,mongodb中实现了capped_集合和可定制的游标 接收进程无限循环地在capped\u集合中寻找新文档,当它找到一个文档时,它执行一个操作 我的问题是,如果我实现了多个接收流程,有没有办法保证一个新文档只被其中一个使用可定制游标的流程读取一次?目标是避免在有两个接收进程在队列中查找新消息时执行两次操作。我对mongodb编程还比较陌生,所以我仍然对它的所有功能都有感觉。mongodb包含了实现原子更新

我正在构建一个排队系统,它通过mongodb中实现的堆栈将消息从一个进程传递到另一个进程,mongodb中实现了capped_集合和可定制的游标

接收进程无限循环地在capped\u集合中寻找新文档,当它找到一个文档时,它执行一个操作


我的问题是,如果我实现了多个接收流程,有没有办法保证一个新文档只被其中一个使用可定制游标的流程读取一次?目标是避免在有两个接收进程在队列中查找新消息时执行两次操作。我对mongodb编程还比较陌生,所以我仍然对它的所有功能都有感觉。

mongodb包含了实现原子更新的详细描述。您不能确保只有一个进程收到新文档,但可以在收到新文档后实施原子更新,以确保只有一个进程对其进行操作。

我最近一直在研究这个问题,我想知道是否有其他方法可以拥有多个读卡器(使用者)不依赖原子更新

这就是我想到的:将逻辑划分为两个“模块”。第一个模块将负责从可定制游标获取新文档。第二个模块将负责处理任意文档。通过这种方式,您只能有一个使用者(模块1)获取文档,该使用者随后将文档发送给多个文档工作人员(第二个模块)


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

问题是确保两个相互竞争的可定制游标从未收到相同的消息。我看不出这与原子更新或您提供的文档链接有什么关系因为您不理解公认的答案,所以您被否决了?也许你不明白如何使用原子更新来“避免操作被执行两次”,但提出问题的人显然明白了。很好,我理解你的问题和答案。原子更新不会“保证一个新文档只被一个使用可定制游标的进程读取一次”,因为两个使用者都将收到相同的文档。他们在收到重复的尾部文档后如何协调是另一回事,也许原子更新会以某种方式参与其中。事实上,被接受的答案对于正确答案来说无关紧要。“目的是避免手术被执行两次”是问题所说的。避免读两遍是实现这一目标的一种方法(也有人问过),但由于这是不可能的,原子更新是实现这一目标所需的技术。如果你有更好的答案,请把它贴出来。可能是问题所说的,但这不是问题,这就是为什么我否决了你的答案-只是为了子孙后代,真的,没有任何私人问题。我没有更好的答案,否则我肯定会把它贴出来。