2012-04-17 87 views
4

我们正在开始一个新项目,我们希望在MongoDB中实现CQRS +事件采购架构。我们已经有了CQRS方法的一些经验:在我们之前的项目中,我们以Fohjin框架为出发点(当然,我们对它进行了重构)。在这种情况下,我们使用Oracle作为存储,并使用TransactionScope实现了2PC。CQRS,事件采购和NoSQL数据库

但是对于我们的新项目,由于其可扩展性和性能,我们希望使用MongoDB。我们肯定希望将它用于阅读(报告)部分并将其用于事件存储。这里的另一种选择是使用SQL Server进行事件存储。所以我们需要做出选择。我不喜欢混合解决方案的是TransactionScope,它很昂贵且速度很慢,并且需要支持不同的Db类型(Mongo和SQL)。

我们研究了NCQRS,但似乎我们不想高度依赖任何框架,这就决定了很多可以从我们的角度实现的东西。所以现在我们正在考虑像Jonathan Oliver的Event Store这样更轻量级的东西。我喜欢stream和commits的概念,它也支持MongoDB。我仍然不明白,它如何处理所有2PC的东西(据说,对于NoSQL)。在我们的例子中,我们需要将事件分派给几个事件处理程序:某种denomerizer,它为某些类型的事件更新读取数据库和任务sheduler。如果这些处理程序出现问题,并且我们得到了一个exeption,那么无法回滚MongoDB的提交。有没有处理这个技巧?

我很欣赏任何关于如何做出正确决定的意见,以及有什么优点和缺点。

回答

4

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

上2PC一些更多的信息,避免分布式事务:

+0

谢谢您的回答,埃利奥特。据我所知,我需要使我的事件处理程序/管道钩子idempotent,添加某种过滤器,将确定事件/提交已分派。这听起来像为每个处理程序添加了很多额外的代码(也许它可以作为一个方面或类似的东西来实现)。 Busides,它为每个处理程序添加一个新的数据库查询来检查。但是,好的,我们可以称之为“解决方案的成本”。另一个问题是何时处理部分处理的事件/提交? – Voice 2012-04-19 05:05:59

+0

是的,您需要构建基础架构以使您自己的事件处理程序具有幂等性。一种方法是在您的活动中嵌入一个唯一的ID,并在您的阅读模型中包含此ID - 然后您将能够判断您是否已经多次处理一个活动。 – 2012-04-19 11:57:45