我最近阅读了很多有关CQRS的文章,对我来说它似乎与事件溯源密切相关。
但是正如这个答案所说的https://dev59.com/J2ox5IYBdhLWcg3wcj94#9217461,对于像我这样的初学者来说,事件溯源似乎有些复杂/可怕(“什么?我的对象当前状态没有存储在任何地方?”)。
因此,我想知道它们是否确实相互关联或是否有任何工具/框架可以在不涉及事件溯源的复杂部分的情况下帮助进行CQRS(事件观察器、命令处理程序)。
谢谢
我最近阅读了很多有关CQRS的文章,对我来说它似乎与事件溯源密切相关。
但是正如这个答案所说的https://dev59.com/J2ox5IYBdhLWcg3wcj94#9217461,对于像我这样的初学者来说,事件溯源似乎有些复杂/可怕(“什么?我的对象当前状态没有存储在任何地方?”)。
因此,我想知道它们是否确实相互关联或是否有任何工具/框架可以在不涉及事件溯源的复杂部分的情况下帮助进行CQRS(事件观察器、命令处理程序)。
谢谢
但是:这三个概念很好地结合在一起,这就是为什么它们经常在同一句话中一起提到的原因。因此,它们并不互相绑定,但它们结合起来非常有意义。
以下图片展示了它们可能如何相互作用:
(该图片来自于JavaScript和Node.js的CQRS和事件溯源框架wolkenkit文档。)您可以在不使用事件溯源的情况下使用CQRS。在命令处理程序中,您可以使用某个存储库来获取或保存聚合根的最后状态。只需实现一个简单的存储库,它将直接从数据库中保存和加载状态。
CQRS和EventSourcing是彼此独立的。但根据需求,我们可以将它们结合起来以实现出色的结果。
让我们举几个例子:
CQRS(不带事件溯源):
电子商务负载均衡器:大多数对电子商务网站的请求都是获取请求,用户将浏览可用产品。还有卖家会更新这些产品和相关信息,但会较少频繁地批量更新。这些卖家请求可以从一个服务器提供服务,而用户请求可以从其他服务器提供服务。这两个服务器都从同一数据库(单一来源点)中获取/更新数据。 在这里没有事件溯源。但我们能够在负载均衡器级别上拆分读取和写入。
数据库主/从:如果数据库吞吐量高,有时我们可以使用从服务器处理读取请求。在这里,我们再次能够在没有事件溯源的情况下拆分读取和写入逻辑。
EventSourcing(不带CQRS):
电子商务回调:假设您想在订单状态更改后向客户发送有关订单确认或取消的邮件/通知。在这里,我们可以在订单状态更改后创建一个事件,并且所有订阅该事件的订阅者都将消耗这些事件。在我们的示例中,邮件/通知类将侦听此事件,并立即发送邮件或通知。在这里没有涉及CQRS。