正如我在 Why is the CQRS repository publishing events, not the event store? 中了解到的发布事件是 CQRS 存储库的任务。到现在为止还挺好。
当然,存储和发布事件应该在一个单一的事务中。从技术上讲,这意味着将一个(或多个)记录写入存储,并将一个(或多个)事件发布到消息总线。因此,一个简单的数据库事务是不够的,它应该是一个分布式的。
现在,不幸的是,许多 NoSQL 数据库(例如 MongoDB)不支持符合 ACID 的事务,更不用说发生在分布式事务中的可能性了。此外,还有一些消息队列也不支持分布式事务。
所以问题是:我该如何处理?
有推荐的模式吗?
最佳答案
您的存储库可以发布事件,但并非必须如此。这种情况下的解决方案是将事件存储用作队列。您将有一个后台进程来监视新事件的事件存储,将它们发布到(例如)总线,然后将它们标记为已调度。
与往常一样,需要权衡取舍。您可能必须处理至少一次消息传递和幂等处理。它比使用简单的分布式事务更复杂。
乔纳森·奥利弗 (Jonathan Oliver) 写了几篇关于此主题的帖子,可能会对您有所帮助:Removing 2PC , How I Avoid Two-Phase Commit , Idempotency Patterns
关于transactions - CQRS:存储事件并发布它们 - 我如何以安全的方式执行此操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13488982/