gpt4 book ai didi

mongodb - MongoDB 可以成为一致的事件存储吗?

转载 作者:可可西里 更新时间:2023-11-01 10:44:33 24 4
gpt4 key购买 nike

在事件存储中存储事件时,事件的存储顺序非常重要,尤其是在稍后投影事件以恢复实体当前状态时。

MongoDB 似乎是持久化事件存储的一个不错的选择,考虑到它的速度和灵活的架构(并且经常被推荐)但是在 MongoDB 中没有事务这样的东西,这意味着正确的事件顺序不能保证。

鉴于这一事实,如果您正在寻找一致的事件存储,而是坚持使用传统的 RDMS,您是否应该不使用 MongoDB,或者是否有解决此问题的方法?

最佳答案

我不熟悉您使用的术语“事件存储”,但我可以解决您问题中的一些问题。我相信根据您的需要使用 MongoDB 可能是合理的,但需要多加小心。

在MongoDB中,每个文档都有一个_id字段,默认为ObjectId格式,由服务器标识符、时间戳和序列计数器组成.因此,您可以对该字段进行排序,并且您将按照创建顺序获取对象,前提是 ObjectId 都是在同一台机器上创建的。

大多数 MongoDB 客户端驱动程序在向数据库发送插入命令之前在本地创建 _id 字段。因此,如果您有多个客户端连接到数据库,则按 _id 排序将无法满足您的要求,因为它将首先按服务器哈希排序,这不是您想要的。

但是如果您可以说服您的 MongoDB 客户端驱动程序不在插入命令中包含 _id,那么服务器将为每个文档生成 ObjectId,并且它们将具有您想要的属性。这样做取决于您使用的语言,因为每种语言都有自己的客户端驱动程序。仔细阅读驱动程序文档或深入研究它们的源代码——它们都是开源的。大多数驱动程序还包括一种向服务器发送原始命令的方法。因此,如果您手动构造一个 insert 命令,这肯定会让您做您想做的事。

如果您的系统非常庞大以至于单个数据库服务器无法处理您所有的写入流量,这将会崩溃。 MongoDB 需要每秒写入数千条记录的解决方案是建立一个分片数据库。在这种情况下,ObjectId 将再次由不同的机器创建,并且不会具有您想要的良好排序属性。如果您担心超过单个服务器的写入容量,您应该寻找另一种提供分布式序列号的技术。

关于mongodb - MongoDB 可以成为一致的事件存储吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12827389/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com