4

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

但是就像这个答案所说的https://stackoverflow.com/a/9217461/277067 对我来说,事件源对于像我这样的初学者来说似乎有点过于复杂/可怕(“什么?我的对象当前状态不会存储在任何地方??”) .

所以我想知道他们是否确实被捆绑了,或者是否有任何工具/名声可以帮助在没有事件采购的复杂部分的情况下进行 cqrs(事件观察者、命令处理程序)。

谢谢

4

5 回答 5

3

简短回答:不,CQRS 和事件溯源没有相互关联。

长答案:不,CQRS 和事件溯源没有相互关联,它们也没有与域驱动设计 (DDD) 关联。

如果你想用几句话来定义 CQRS、事件溯源和 DDD 是什么,你可能会想出以下解释(当然,它们过于简化了,但这正是这里的重点):

  • CQRS 是一种将写入状态与读取状态(命令与查询)分开的设计模式。
  • 事件溯源是一种将数据存储在数据库中的方法,其中存储的是增量而不是实际状态。
  • DDD 是一种在跨学科团队中更容易进行领域交流的方法。

他们每个人在没有其他人的情况下都能很好地工作。例如,您可以使用 DDD 对域进行建模,然后在没有 CQRS 或事件源的情况下实现它。您也可以在不需要 DDD 或 CQRS 的情况下进行事件溯源。等等……</p>

但是:这三个概念很好地结合在一起,这就是为什么它们经常在一个句子中被称为。所以,不,它们没有相互联系,但它们相互结合很有意义。

下图显示了它们如何相互交互:

CQRS、事件溯源和 DDD 的组合

(图片取自wolkenkit 的文档,这是一个用于 JavaScript 和 Node.js 的 CQRS 和事件源框架。)

  • CQRS 描述了您向写入模型发送命令,以及您接收事件并订阅来自读取模型的查询。
  • 事件溯源与写入模型一起使用,以存储作为客户端发送命令的结果而发布的事件。
  • DDD 在写入模型中用于将命令转换为事件并运行适当的逻辑。
于 2017-12-07T17:37:31.423 回答
1

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

于 2012-07-10T17:39:40.870 回答
0

不,他们没有被 IMO 捆绑,你可以在这里找到我对相关问题的理由

于 2014-04-17T12:44:04.473 回答
0

简而言之,我应该说:我们可以在没有事件源的情况下拥有 CQRS。但是没有 CQRS,我们就无法进行事件溯源。一般来说,我们有 3 种类型的 CQRS:标准、事件溯源和最终一致性。

于 2017-12-11T06:08:31.070 回答
0

CQRS 和 EventSourcing 是相互独立的。但是根据需要,我们可以将它们结合起来,取得很好的效果。

让我们举一些例子:

CQRS(没有事件源):

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

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

EventSourcing(没有 CQRS):

  1. 电子商务回调:假设您想在订单状态更改后向客户发送有关订单确认或取消的邮件/通知。在这里,我们可以在订单状态更改后创建一个事件,所有监听该事件的订阅者都将使用这些事件。在我们的示例中,邮件/通知类将监听此事件并立即发送邮件或通知。这里不涉及 CQRS。
于 2021-07-15T08:13:35.840 回答