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