【问题标题】:Can MongoDB be a consistent event store?MongoDB 可以成为一致的事件存储吗?
【发布时间】:2012-10-10 19:59:35
【问题描述】:

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

考虑到它的速度和灵活的模式(通常建议这样做),MongoDB 似乎是持久化事件存储的好选择,但是 MongoDB 中没有事务这样的东西,这意味着不能正确的事件顺序保证。

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

【问题讨论】:

  • 交易如何保证事件顺序?如果您为每个事件添加时间戳会那不能保证顺序?
  • 你读过 MongoDB 中的 Atomic Operations 吗?例如,如果您将 $pushing 事件添加到数组中,则您应该具有一致的顺序。如果您的事件是短暂的,您还可以考虑使用Capped Collection,它按插入顺序维护文档,并具有 FIFO 自动老化功能。另一种选择是考虑sequences。有助于解释您如何对事件进行建模。

标签: mongodb nosql event-sourcing consistency


【解决方案1】:

我不熟悉您使用的“事件存储”一词,但我可以解决您问题中的一些问题。我相信将 MongoDB 用于你想要的东西可能是合理的,但要小心一点。

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-03
    • 1970-01-01
    相关资源
    最近更新 更多