CQRS是否与事件溯源相关联?

4

我最近阅读了很多有关CQRS的文章,对我来说它似乎与事件溯源密切相关。

但是正如这个答案所说的https://dev59.com/J2ox5IYBdhLWcg3wcj94#9217461,对于像我这样的初学者来说,事件溯源似乎有些复杂/可怕(“什么?我的对象当前状态没有存储在任何地方?”)。

因此,我想知道它们是否确实相互关联或是否有任何工具/框架可以在不涉及事件溯源的复杂部分的情况下帮助进行CQRS(事件观察器、命令处理程序)。

谢谢


1
tl;dr:它们没有绑定。您也不需要工具。 - Yves Reynhout
5个回答

3
短答案:不,CQRS和事件溯源不相互绑定。
长答案:不,CQRS和事件溯源不相互绑定,也与领域驱动设计(DDD)无关。
如果您想用几个词来定义CQRS、事件溯源和DDD,您可以得出以下解释(当然,它们都是过于简化的,但这正是这里的重点):
- CQRS是一种设计模式,将写状态与读状态分开(命令vs查询)。 - 事件溯源是一种在数据库中存储数据的方式,其中存储增量而不是实际状态。 - DDD是一种使跨学科团队之间的领域通信更容易的方法。
它们每一个都可以很好地独立运作。例如,您可以使用DDD对领域进行建模,然后在没有CQRS或事件溯源的情况下进行实现。您也可以在不需要DDD或CQRS的情况下进行事件溯源等等。

但是:这三个概念很好地结合在一起,这就是为什么它们经常在同一句话中一起提到的原因。因此,它们并不互相绑定,但它们结合起来非常有意义。

以下图片展示了它们可能如何相互作用:

CQRS, event-sourcing and DDD in combination

(该图片来自于JavaScript和Node.js的CQRS和事件溯源框架wolkenkit文档。)
  • CQRS描述了向写模型发送命令,并从读模型接收事件和订阅查询。
  • 事件溯源与写模型一起使用,以存储作为客户端发送的命令结果发布的事件。
  • 在写模型中使用DDD将命令转换为事件并运行适当的逻辑。

1

您可以在不使用事件溯源的情况下使用CQRS。在命令处理程序中,您可以使用某个存储库来获取或保存聚合根的最后状态。只需实现一个简单的存储库,它将直接从数据库中保存和加载状态。


0

我认为它们并不相互绑定,你可以在这里找到我对相关问题的解释。


0

CQRS和EventSourcing是彼此独立的。但根据需求,我们可以将它们结合起来以实现出色的结果。

让我们举几个例子:

CQRS(不带事件溯源):

  1. 电子商务负载均衡器:大多数对电子商务网站的请求都是获取请求,用户将浏览可用产品。还有卖家会更新这些产品和相关信息,但会较少频繁地批量更新。这些卖家请求可以从一个服务器提供服务,而用户请求可以从其他服务器提供服务。这两个服务器都从同一数据库(单一来源点)中获取/更新数据。 在这里没有事件溯源。但我们能够在负载均衡器级别上拆分读取和写入。

  2. 数据库主/从:如果数据库吞吐量高,有时我们可以使用从服务器处理读取请求。在这里,我们再次能够在没有事件溯源的情况下拆分读取和写入逻辑。

EventSourcing(不带CQRS):

电子商务回调:假设您想在订单状态更改后向客户发送有关订单确认或取消的邮件/通知。在这里,我们可以在订单状态更改后创建一个事件,并且所有订阅该事件的订阅者都将消耗这些事件。在我们的示例中,邮件/通知类将侦听此事件,并立即发送邮件或通知。在这里没有涉及CQRS。

0
简而言之,我应该说:我们可以在没有事件溯源的情况下使用CQRS。但是我们不能在没有CQRS的情况下使用事件溯源。一般来说,我们有三种类型的CQRS:标准、事件溯源和最终一致性。

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