为啥 CQRS 存储库发布事件,而不是事件存储?

Posted

技术标签:

【中文标题】为啥 CQRS 存储库发布事件,而不是事件存储?【英文标题】:Why is the CQRS repository publishing events, not the event store?为什么 CQRS 存储库发布事件,而不是事件存储? 【发布时间】:2012-10-01 17:17:41 【问题描述】:

根据http://cre8ivethought.com/blog/2009/11/12/cqrs--la-greg-young,负责使用事件发布者发布事件的组件是存储库。

我的问题很简单:为什么会这样?

在这篇博文中,我们被告知:

域存储库负责发布事件,这通常与将事件一起存储在事件存储中的单个事务中。

我本以为这是事件存储的一项任务:一旦存储了一个(或多个事件),它就会被发布。

那么为什么它在存储库中?

【问题讨论】:

【参考方案1】:

您的域模型不知道存储机制。另一方面,它必须确保发布适当的事件,无论您使用事件存储、经典 SQL 存储还是任何其他持久性方式。

如果您依赖事件存储来发布事件,您将与存储机制紧密耦合。

【讨论】:

因为事件的存储和该事件的发布需要原子操作,同时仍然避免2PC,并且正如您所提到的,这些事件的发布不应该是底层事件存储的责任, 是在设置“未发布”标记的同时使用数据库表存储事件的解决方案。是否有另一个进程从该表中读取标记为“未发布”的事件,然后发布它们,然后设置标记并提交事务?如果是这种情况,那么轮询该表以获取未发布的事件是实现此目的的方法吗?【参考方案2】:

存储和发布事件必须是原子指令,因为如果两个操作之一失败,则此事件的侦听器将与事件的生产者不同步。

与从事件存储中发布事件相比,还有另一种(更昂贵的)解决方案,即使用 2pc 事务(两阶段提交)。

您可以在这里找到更多有趣的信息:https://cqrs.wordpress.com/documents/building-event-storage/

【讨论】:

以上是关于为啥 CQRS 存储库发布事件,而不是事件存储?的主要内容,如果未能解决你的问题,请参考以下文章

Axon 或 Kafka 支持 CQRS/ES

事件溯源/CQRS 读取模型 - 预测

CQRS - 重新发布事件

为啥选择 UnityEvent 而不是原生 C# 事件?

CQRS 和事件溯源指南

事件溯源和 CQRS,我错过了啥?