CQRS 设计模式更新



我一直在寻找实现CQRS模式。 对于更新读取数据库的过程,最好使用 Windows 服务,还是在更新数据库中创建新记录时更新视图? 最好使用触发器还是其他进程? 我已经看到了几种方法,但还没有决定实现这一目标的最佳方法是什么。

谢谢。

就我个人而言,我喜欢使用消息传递来解决此类问题。

命令在处理时会产生事件,如果使用消息传递发布事件,则一个或多个下游读取服务可以订阅事件并处理它们以更新读取模型。

在这种情况下,消息传递之所以很好,是因为它允许您将写入端和读取端相互分离。此外,如果您发现需要,它允许您轻松拥有多个订阅者。此外,使用持久队列系统(如 MSMQ)的消息传递允许重试失败的消息。这也意味着您可以离线使用读取模型(用于更新等),当它恢复时,它可以处理队列中的所有事件。

我不是关系数据库中触发器的朋友,但我想一定很难测试。触发器会在不属于它的地方引入路由逻辑。是否也是如果触发器操作失败,整个写入事务会回滚?触发器可能是最无益的解决方案。

这取决于应用程序在最终一致性方面的容忍度。

如果你的应用在 5 分钟前读取数据没有问题,则无需在每次写入数据更改时进行非规范化。在这种情况下,例如,每 n 分钟启动一次或仅在 CPU 消耗低于特定阈值时才启动的后台服务可能是一个很好的解决方案。

另一方面,如果您的应用程序对时间敏感,例如在频繁更改的状态、机器监控、证券交易所数据等的情况下,那么您将需要保持尽可能低的滞后并当场非规范化 - 即,在进程中或至少实时。因此,在这种情况下,您可以选择在持续运行的过程中运行反规范化程序,或者直接在代码中将它们添加到事件处理程序链中。

您的来电。

最新更新