在CQRS中,最佳的反规范化实践是什么?

5
我正在尝试创建一个守护进程来对我的数据库进行去规范化。
我使用ActiveMQ作为队列管理器,有两个数据库:关系型数据库(写入+复制)和去规范化数据库(用于读取)。
我的问题是,最佳实践是什么,以便对真实数据库进行去规范化?我有一些想法:
- MySQL代理(带有lua),读取队列(这可能吗) - 在MySQL中触发器 - Java守护进程作为服务,读取队列 - Cron表?(但我将拥有大量延迟时间)

1
出于兴趣,你为什么要编写一个守护进程?我对CQRS非常陌生,但从我所读的内容来看,建议的方法是直接从写入/命令服务中引发事件(使用可靠的消息传递,如NServiceBus)。 - Chris Moutray
1个回答

3
我不确定这是否是官方的“最佳”实践,但总体而言使用事件驱动写入和更新读模型的事件溯源是一种好的实践。使用事件溯源时,写模型不像关系数据库中的实体和关系那样存在,而是作为事件历史记录存在(我知道这一开始听起来很困惑)。你可以从Eventide(用Ruby)的实现中学到更多有关事件溯源的内容。https://eventide-project.org/
我在这里也有一个关于使用领域事件的CQRS简介:http://lucisferre.net/2010/11/04/a-brief-introduction-to-cqrs/
然而,这并没有真正回答你的直接问题,最终事件溯源可能并不适合您。既然您已经将“写”模型的状态存储在关系数据库中,那么触发器是一种可能的方式,但这会使您的系统非常数据中心化。如果您能够通过代码中的触发器来实现相同的目标,那么它将更加干净和可测试。
为此,我仍然会使用领域事件模式,并使用事件总线将事件发布到事件处理程序,后者负责更新读模型。将这些事件和处理程序视为SQL触发器,但基于您的领域设计和其行为。Udi Dahan有很多关于这种方法的好材料,其中领域事件用于更新读模型,但不使用事件溯源。http://www.udidahan.com/?blog=true

前两个链接是404。 - coderz
1
谢谢。我修复了一个问题。我不知道cqrsinfo.com网站发生了什么事情。我将链接到新的Eventide项目,因为它迄今为止是事件溯源实践中更好的示例之一,也是一个很好的参考。 - Chris Nicola

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