为啥 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 存储库发布事件,而不是事件存储?的主要内容,如果未能解决你的问题,请参考以下文章