我正在尝试创建一个守护进程来对我的数据库进行非规范化.
我使用ActiveMQ作为队列管理器
我有2个数据库:关系数据库(写复制)和非规范化数据库(用于读取)
我的问题是对我的真实数据库进行非规范化的最佳实践是什么,我有一些想法:
> MySQL代理(带有lua)读取队列(这是可能的)
>在MysqL中触发
> Java守护程序作为读取队列的服务
> Cron标签? (但我会有很多延迟时间
最佳答案
我不确定这是否是官方的“最佳”做法,但总的来说,我发现使用事件源并使用事件来驱动写入和更新读取模型是一种很好的做法.使用事件源,写入模型本身不会作为关系数据库中的实体和关系存在,而是作为事件的历史存在(我知道一开始听起来很令人困惑)
通过研究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