MongoDB 自增字段和读取顺序 更新:

问题描述

我有一个多实例服务,每秒向 Mongo 数据库写入大约 100 个文档。

现在我正在开发一个应用程序,它必须按照插入的顺序处理这些文档。

我坚持严格的顺序处理顺序的要求。

我想避免为此使用任何队列消息传递系统,因此最简单的解决方案可能是向每个文档添加一个唯一的自动增量字段,然后调用 find() 方法获取一些具有字段值大于上次处理的文档。 我已阅读 this official article 关于在 Mongo 中创建自动递增字段的内容,但这种方法是否能保证写入顺序?

比方说,有这个操作序列按照指定的顺序发生,但中间没有延迟(自动增量字段的初始值 = 0):

  1. 服务的实例 #1 使用庞大的复杂文档 #1 调用 db.collection.insertOne(),这可能使 Mongo 需要一些时间来处理它。
  2. 实例 #2 使用一个小的简单文档 #2 调用 insertOne()
  3. 我的应用在同一个集合上执行 find()

步骤 3 中的 find() 方法是否有可能仅返回自增字段值为 2 的文档 #2,并且片刻之后文档 #1 将最终写入值为 1 的数据库

基本上,我担心自动递增字段的值可能会在相应的文档可供读取之前发生碰撞,因此尽管具有更高的字段值,但客户端可以在第一个文档之前看到下一个文档。

更新:

这是我认为可能发生的事情的时间表:

timeline

解决方法

我发现我的问题中描述的情况,当后来插入的文档 #2 在文档 #1 之前变得可见时,这是不可能的,至少对于独立的 Mongo 实例是不可能的。

MongoDB 在这种情况下保证单调写入:

https://docs.mongodb.com/manual/core/read-isolation-consistency-recency/#monotonic-writes

,

如果 _id=1 的文档 #1 已经写入数据库,则您的文档 #2 只能具有 _id=2。

因此,您所描述的情况不会发生 - 如果数据库中没有文档 #1,则您无法在客户端构建带有 _id=2 的文档 #2。文档 #1 和 #2 的持久化操作,如果它们具有不同的 _id 值,则必须是顺序的(不重叠)。