为什么CQRS存储库发布事件而不是事件存储?

10
根据 http://cre8ivethought.com/blog/2009/11/12/cqrs--la-greg-young,使用事件发布者发布事件的组件是存储库。
我的问题很简单:为什么是存储库?
在这篇博客文章中,我们被告知:
领域存储库负责发布事件,通常与将事件存储在事件存储中一起在单个事务中完成。
我本以为这应该是事件存储的任务:一旦事件(或多个事件)被存储,它就会被发布。
那么为什么是存储库呢?
2个回答

9
你的领域模型不知道存储机制。另一方面,必须确保适当的事件将被发布,无论是使用事件存储、经典的SQL存储还是任何其他持久化手段。 如果依赖事件存储来发布事件,那么就会与存储机制紧密耦合。

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

2
存储和发布事件必须是原子指令,因为如果其中一个操作失败,该事件的侦听器将与该事件的生产者不同步。
与从事件存储中发布事件相比,还有另一种更昂贵的解决方案,即使用2pc事务(两阶段提交)。
您可以在此处找到更多有趣的信息:https://cqrs.wordpress.com/documents/building-event-storage/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接