正如我在为什么 CQRS 存储库发布事件而不是事件存储中了解到的? 发布事件是 CQRS 存储库的任务。目前为止,一切都好。
当然,存储事件和发布事件应该在一个事务中。从技术上讲,这意味着将一条(或多条)记录写入存储区,并将一条(或多条)事件发布到消息总线。因此,一个简单的数据库事务是不够的,它应该是分布式的。
现在,不幸的是,许多NoSQL数据库(如MongoDB)不支持符合ACID的事务,甚至更不用说在分布式事务中发生的可能性了。此外,还有一些消息队列也不支持分布式事务。
所以问题是:我该如何处理这个问题?
是否有推荐使用的模式?
您的仓库可以发布事件,但不必如此。在这种情况下,解决方案是将事件存储用作队列。您将有一个后台进程,用于监视事件存储中的新事件,将它们发布到(例如)总线,然后将它们标记为已调度。
与往常一样,需要权衡取舍。您可能需要处理至少一次消息传递和幂等处理。它比使用简单的分布式事务更复杂。
乔纳森·奥利弗(Jonathan Oliver)写了几篇关于这个主题的文章,可能会对你有所帮助:删除2PC,我如何避免两阶段提交,幂等模式