但是对于我们的新项目,由于其可扩展性和性能,我们希望使用MongoDB.我们肯定希望将它用于读取(报告)部分并将其用于事件存储.这里的替代方法是使用SQL Server进行事件存储.所以我们需要做出选择.我不喜欢混合解决方案的是TransactionScope,它既昂贵又慢又需要支持不同的Db类型(Mongo和SQL).
我们查看了NCQRS,但似乎我们不希望高度依赖任何框架,这些框架规定了许多可以从我们的观点不同地实现的事情.所以现在我们正在考虑像Jonathan Oliver的Event Store那样更轻量级的东西.我喜欢流和提交的概念,它也支持MongoDB.我仍然不明白,它如何处理所有2PC的东西(据说,对于NoSQL来说).在我们的例子中,我们需要将事件dipatch到几个事件处理程序:某种denomalizer更新读取数据库和任务sheduler用于某些类型的事件.如果这些处理程序出现问题并且我们得到了一个exeption,则无法回滚MongoDB的提交.有没有办法解决这个问题?
我感谢任何关于如何做出正确决定以及利弊的评论.
解决方法
关于2PC的更多信息并避免分布式事务:
> http://blog.jonathanoliver.com/2010/04/extending-nservicebus-avoiding-two-phase-commits
> http://blog.jonathanoliver.com/2011/04/how-i-avoid-two-phase-commit
> https://github.com/elliotritchie/NES/wiki/Transactions
> http://bill-poole.blogspot.com/2008/06/idempotent-messages.html