CQRS是否与事件采购挂钩?

时间:2012-07-10 14:21:20

标签: cqrs event-sourcing

我最近阅读了很多关于CQRS的内容,对我而言,它似乎与事件采购密切相关。

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

所以我想知道他们是否真的被束缚,或者是否有任何工具/ famework可以帮助做cqrs(事件观察者,命令处理程序)而没有事件源的复杂部分。

由于

5 个答案:

答案 0 :(得分:2)

简答:不,CQRS和事件采购彼此没有联系。

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

如果你想用几个词来定义什么是CQRS,事件源和DDD,你可能会得到如下的解释(当然,它们是过度简化的,但这正是这里的重点) :

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

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

但是:这三个概念很好地结合在一起,这就是为什么它们经常在一个句子中被召集起来的原因。所以,不,他们没有彼此联系,但他们彼此结合起来很有意义。

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

CQRS, event-sourcing and DDD in combination

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

在简短的回答中,我应该说:我们可以在没有事件采购的情况下拥有CQRS。但是如果没有CQRS,我们就无法进行事件采购。一般来说,我们有3种类型的CQRS:标准,事件来源和最终的一致性。

答案 4 :(得分:0)

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

让我们举一些例子:

CQRS(没有事件溯源):

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

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

EventSourcing(没有 CQRS):

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