我正在寻找实现 CQRS 模式。对于更新读数据库的过程,是最好使用windows服务,还是在更新数据库中创建新记录的时候更新视图?最好使用触发器还是其他一些过程?我已经看到了几种方法,但还没有下定决心实现这一目标的最佳方法是什么。
谢谢。
我正在寻找实现 CQRS 模式。对于更新读数据库的过程,是最好使用windows服务,还是在更新数据库中创建新记录的时候更新视图?最好使用触发器还是其他一些过程?我已经看到了几种方法,但还没有下定决心实现这一目标的最佳方法是什么。
谢谢。
我个人喜欢使用消息传递来解决这类问题。
您的命令在处理它们时会产生事件,如果您使用消息传递来发布事件,一个或多个下游读取服务可以订阅事件并处理它们以更新读取模型。
在这种情况下消息传递很好的原因是它允许您将写入端和读取端相互分离。此外,如果您发现需要它,它还可以让您轻松拥有多个订阅者。此外,使用 MSMQ 等持久排队系统进行消息传递可以重试失败的消息。这也意味着您可以离线读取模型(用于更新等),当它恢复时,它可以处理队列中的所有事件。
我不是关系数据库中触发器的朋友,但我想它一定很难测试。触发器会在不属于它的地方引入路由逻辑。难道也是如果触发动作失败了,整个写事务就回滚了?触发器可能是最不利的解决方案。
这取决于您的应用程序对最终一致性的容忍度。
如果您的应用程序在读取数据 5 分钟前没有问题,则无需在每次写入数据更改时进行非规范化。在这种情况下,例如每 n 分钟启动一次或仅在 CPU 消耗低于某个阈值时启动的后台服务可能是一个很好的解决方案。
另一方面,如果您的应用程序对时间敏感,例如在状态频繁变化、机器监控、证券交易所数据等情况下,那么您将希望尽可能降低延迟并在现场进行非规范化——也就是说,在进程中或至少是实时的。因此,在这种情况下,您可以选择在持续运行的进程中运行非规范化程序,或者直接在代码中将它们添加到事件处理程序链中。
你的来电。