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

时间:2012-10-10 19:59:36

标签: mongodb consistency event-store nosql

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

MongoDB似乎是持久化事件存储的一个很好的选择,因为它的速度和flexibel模式(并且通常建议如此)但是在MongoDB中没有事务这样的事情意味着正确的事件顺序不能是保证下。

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

1 个答案:

答案 0 :(得分:1)

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

在MongoDB中,每个文档都有一个_id字段,默认情况下为ObjectId格式,包含服务器标识符,然后是时间戳,然后是序列计数器。因此,您可以对该字段进行排序,并且只要ObjectId都在同一台机器上创建,您就可以按创建顺序获取对象。

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

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

如果您的系统太大而单个数据库服务器无法处理您的所有写入流量,这将会中断。需要每秒写入数千条记录的MongoDB解决方案是设置分片数据库。在这种情况下,ObjectIds将再次由不同的机器创建,并且不具有您想要的良好排序属性。如果您担心单个服务器的写入时间过长,那么您应该寻找另一种提供分布式序列号的技术。