transactions - CQRS:存储事件并发布它们 - 我如何以安全的方式执行此操作?

标签 transactions cqrs event-sourcing neventstore

正如我在 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/

相关文章:

domain-driven-design - 如何使用事件溯源更新大量数据

c# - 发送命令后更新 UI

c# - TransactionScope 真正做什么

PHP + MySQL : How much programming can or should I include within a db transaction?

session 关闭时的 NHibernate 事务管理

java - 模拟现实生活收银机的收银机对象 - Java

architecture - CQRS:查询和业务规则

domain-driven-design - 将新的 BC 引入 DDD 应用程序的最佳实践是什么?

cqrs - 将事件附加到 eventstore

nservicebus - 如何创建使用不同传输的单个 NServiceBus 端点?