我对MongoDB有一个理论上的问题: 我有一个从MongoDB数据库中读取数据的API。我们必须确保集合中的每个项目最终都会传递,但只能在插入或更改后传递一次。因此,客户需要最新版本的项目,但只有一次,如果没有更改,我们绝不能再发送一个项目。
我们首先考虑通过使用日期来实现此目的:客户端发送最后一个查询的日期,我们将仅传递在该日期之后创建或更改的项目。我看到的问题是,如果群集的一部分在一段时间内不可用并且未与其余部分同步,我们可能会错过项目。这些项目永远不会被传递(因为它们是在上次同步后创建的,没有与其他项目同步,而且客户端现在有一个较新的“上次获取”时间)。
由于这不起作用,我考虑用某种ACK-Flag解决这个问题,这在创建时是假的,在发送到客户端后是真的。更改后,它将再次设置为false。在这里,我看到的问题是,如果有人在当前发送给客户端时更改了项目,则此更改可能会在之后丢失(更改显示ACK = false,但交付后说ACK = true)。
这似乎没有按预期工作,所以现在我正在考虑某种乐观锁定,我在DB中存储一个版本并且只有在版本没有从读取变为写入时才更新ACK = true。
这应该可行,但似乎根本不是最佳的(如果在写ACK时调用崩溃了怎么办?)。因为这似乎是一个常见问题:对此最好的解决方案是什么?或者MongoDB不适合这项工作?如果您希望在某个时刻必须垂直缩放,是否可以解决此问题?