【问题标题】:Is CQRS tied up to Event Sourcing?CQRS 是否与事件溯源相关联?
【发布时间】:2012-07-10 01:15:27
【问题描述】:

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

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

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

谢谢

【问题讨论】:

标签: cqrs event-sourcing


【解决方案1】:

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

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

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

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      不,他们与 IMO 无关,您可以找到我对相关问题的理由here

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

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

          让我们举几个例子:

          CQRS(无事件溯源):

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

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

          EventSourcing(不含 CQRS):

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-01-31
            • 1970-01-01
            • 1970-01-01
            • 2018-11-15
            • 2019-09-22
            • 1970-01-01
            • 2020-03-20
            • 1970-01-01
            相关资源
            最近更新 更多