MongoDB 自动递增字段和读取顺序
MongoDB auto-increment field and read order
我有一个多实例服务,每秒将约 100 个文档写入 Mongo 数据库。
现在我正在开发一个必须按插入顺序处理这些文档的应用程序。
我受困于这种严格顺序处理顺序的要求。
我想为此避免任何队列消息传递系统,所以最简单的解决方案可能是为每个文档添加一个唯一的自动递增字段,然后调用 find()
方法来获取一些文档具有比上次处理的文档更大的字段值。
我读过 this official article 关于在 Mongo 中创建自动递增字段的内容,但这种方法是否保证写入顺序?
比方说,有这样一个操作序列按照指定的顺序发生,但中间没有延迟(自增字段的初始值 = 0):
- 服务调用的实例 #1
db.collection.insertOne()
带有一个巨大的复杂文档 #1,这可能会使 Mongo 需要一些时间来处理它。
- 实例 #2 使用小型简单文档 #2 调用
insertOne()
。
- 我的应用对同一个集合执行
find()
。
第 3 步中的 find()
方法是否有可能 return 仅文档 #2 的自动增量字段的值为 2,片刻之后文档 #1最终将以值 = 1 写入数据库?
基本上,恐怕在相应文档可供读取之前,自动递增字段的值可能会发生变化,因此尽管字段值更高,但下一个文档可能会在第一个文档之前对客户端可见.
更新:
这是我认为可能发生的事情的时间表:
如果 _id=1 的文档 #1 已经写入数据库,则您的文档 #2 只能有 _id=2。
因此,您所描述的情况不会发生 - 如果数据库中没有文档 #1,则您无法在客户端构建 _id=2 的文档 #2。文档 #1 和 #2 的持久化操作,如果它们具有不同的 _id 值,则必须是顺序的(非重叠)。
我发现我的问题中描述的情况是,当后来插入的文档 #2 在文档 #1 之前可见时,这是不可能的,至少对于独立的 Mongo 实例。
Mongo数据库在这种情况下保证单调写入:
https://docs.mongodb.com/manual/core/read-isolation-consistency-recency/#monotonic-writes
我有一个多实例服务,每秒将约 100 个文档写入 Mongo 数据库。
现在我正在开发一个必须按插入顺序处理这些文档的应用程序。
我受困于这种严格顺序处理顺序的要求。
我想为此避免任何队列消息传递系统,所以最简单的解决方案可能是为每个文档添加一个唯一的自动递增字段,然后调用 find()
方法来获取一些文档具有比上次处理的文档更大的字段值。
我读过 this official article 关于在 Mongo 中创建自动递增字段的内容,但这种方法是否保证写入顺序?
比方说,有这样一个操作序列按照指定的顺序发生,但中间没有延迟(自增字段的初始值 = 0):
- 服务调用的实例 #1
db.collection.insertOne()
带有一个巨大的复杂文档 #1,这可能会使 Mongo 需要一些时间来处理它。 - 实例 #2 使用小型简单文档 #2 调用
insertOne()
。 - 我的应用对同一个集合执行
find()
。
第 3 步中的 find()
方法是否有可能 return 仅文档 #2 的自动增量字段的值为 2,片刻之后文档 #1最终将以值 = 1 写入数据库?
基本上,恐怕在相应文档可供读取之前,自动递增字段的值可能会发生变化,因此尽管字段值更高,但下一个文档可能会在第一个文档之前对客户端可见.
更新:
这是我认为可能发生的事情的时间表:如果 _id=1 的文档 #1 已经写入数据库,则您的文档 #2 只能有 _id=2。
因此,您所描述的情况不会发生 - 如果数据库中没有文档 #1,则您无法在客户端构建 _id=2 的文档 #2。文档 #1 和 #2 的持久化操作,如果它们具有不同的 _id 值,则必须是顺序的(非重叠)。
我发现我的问题中描述的情况是,当后来插入的文档 #2 在文档 #1 之前可见时,这是不可能的,至少对于独立的 Mongo 实例。
Mongo数据库在这种情况下保证单调写入:
https://docs.mongodb.com/manual/core/read-isolation-consistency-recency/#monotonic-writes