4

我们正在开始一个新项目,我们希望在其中使用 MongoDB 实现 CQRS + 事件溯源架构。我们已经对 CQRS 方法有了一些经验:在我们之前的项目中,我们以 Fohjin 框架为起点(嗯,我们对其进行了重大重构)。在这种情况下,我们使用 Oracle 作为存储,并使用 TransactionScope 实现了 2PC。

但是对于我们的新项目,我们希望使用 MongoDB,因为它具有可扩展性和性能。我们肯定想将它用于读取(报告)部分并将其用于事件存储。此处的替代方法是使用 SQL Server 进行事件存储。所以我们需要做出选择。我不喜欢混合解决方案的是 TransactionScope,它既昂贵又缓慢,而且需要支持不同的 Db 类型(Mongo 和 SQL)。

我们研究了 NCQRS,但似乎我们不想高度依赖任何框架,从我们的角度来看,这决定了很多可以以不同方式实现的东西。所以现在我们正在考虑更轻量级的东西,比如 Jonathan Oliver 的 Event Store。我喜欢流和提交的概念,它也支持 MongoDB。我仍然不明白的是,它如何处理所有 2PC 的东西(据说是用于 NoSQL)。在我们的例子中,我们需要将事件分配给几个事件处理程序:某种类型的去噪器,它为特定类型的事件更新读取数据库和任务调度器。如果这些处理程序出现问题并且我们遇到异常,则无法回滚 MongoDB 的提交。有什么技巧可以解决这个问题吗?

我感谢任何关于如何做出正确决定以及利弊的评论。

4

1 回答 1

4

EventStore 使用 Guid 来唯一标识针对数据库的提交,以防止相同的事件流被持久化多次。通常,此 Guid 直接嵌入在消息中,唯一标识该特定消息,并且可以在对事件流调用 CommitChanges 时用作 CommitId。在处理系统查询端的事件时,您可以使用类似的方法。

有关 2PC 和避免分布式事务的更多信息:

于 2012-04-18T01:10:03.467 回答