CQRS,事件溯源和NoSQL数据库

5
我们正在启动一个新的项目,希望使用CQRS+事件溯源架构和MongoDB实现。我们已经有了一些使用CQRS方法的经验:在之前的项目中,我们以Fohjin框架为起点(好吧,我们对它进行了重构)。我们使用Oracle作为存储,并在那种情况下实现了带TransactionScope的2PC。
但是对于我们的新项目,由于MongoDB的可扩展性和性能,我们想使用它。我们肯定要将其用于读取(报告)部分,并考虑将其用于事件存储。这里的替代方案是使用SQL Server进行事件存储。因此,我们需要做出选择。我不喜欢混合解决方案中昂贵且缓慢的TransactionScope,以及支持不同的Db类型(Mongo和SQL)的必要性。
我们看过NCQRS,但似乎我们不想高度依赖任何框架,因为它会规定很多从我们的角度可以实现不同的东西。所以现在我们想找什么更轻量级的东西,比如Jonathan Oliver的Event Store。我喜欢流和提交的概念,它也支持MongoDB。但我仍然不理解它如何处理所有那些2PC的东西(它声称适用于NoSQL)。在我们的情况下,我们需要将事件分派给多个事件处理程序:某种更新读取数据库的去规范化器和某些类型的事件的任务调度程序。如果这些处理程序出了问题并且我们得到了一个异常,就没有办法回滚MongoDB的提交。有什么技巧可以处理这个问题吗?
我欣赏任何关于如何做出正确决策以及利弊的评论。
1个回答

5
事件存储(EventStore)使用Guid来唯一标识针对数据库的提交,以防止同一事件流被多次持久化。通常情况下,该Guid直接嵌入到消息中,唯一标识该特定消息,并且在调用事件流的CommitChanges时可以用作提交ID (CommitId)。在处理系统的查询端的事件时,可以使用类似的方法。
关于两阶段提交(2PC)和避免分布式事务的更多信息,请参见以下链接:

谢谢你的回答,Elliot。据我所知,我需要使我的事件处理程序/管道钩子具有幂等性,添加某种过滤器来确定事件/提交是否已经被分派。这听起来像是为每个处理程序添加了很多额外的代码(也许可以实现为方面或类似的东西)。此外,它为每个处理程序添加了一个新的数据库查询,以进行检查。但是,好吧,我们可以称其为“解决方案的成本”。另一个问题是何时处理部分处理的事件/提交? - Voice
是的,您需要构建基础设施来使自己的事件处理程序具有幂等性。一种方法是在事件中嵌入唯一的ID,并将此ID包含在读取模型中 - 然后您将能够确定是否多次处理了事件。 - Elliot Ritchie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接