26

正如我在为什么 CQRS 存储库发布事件而不是事件存储中所学到的那样?发布事件是 CQRS 存储库的任务。到现在为止还挺好。

当然,存储事件和发布它们应该在一个事务中。从技术上讲,这意味着将一个(或多个)记录写入存储,并将一个(或多个)事件发布到消息总线。因此,一个简单的数据库事务是不够的,它应该是一个分布式的。

现在,不幸的是,许多 NoSQL 数据库(例如 MongoDB)不支持符合 ACID 的事务,更不用说在分布式事务中发生的可能性了。此外,还有不支持分布式事务的消息队列。

所以问题是:我该如何处理?

有推荐使用的模式吗?

4

1 回答 1

22

您的存储库可以发布事件,它不必这样做。这种情况下的解决方案是将事件存储用作队列。您将有一个后台进程来监视事件存储中的新事件,将它们发布到(例如)总线,然后将它们标记为已调度。

与往常一样,需要权衡取舍。您可能必须处理至少一次的消息传递和幂等处理。它比使用简单的分布式事务更复杂。

乔纳森奥利弗写了几篇关于这个主题的文章,可能会对你有所帮助:删除 2PC我如何避免两阶段提交幂等模式

于 2012-11-21T09:44:42.220 回答