我最近阅读了很多关于 CQRS 的内容,对我来说,它似乎与事件溯源密切相关。
但是就像这个答案所说的https://stackoverflow.com/a/9217461/277067 对我来说,事件源对于像我这样的初学者来说似乎有点过于复杂/可怕(“什么?我的对象当前状态不会存储在任何地方??”) .
所以我想知道他们是否确实被捆绑了,或者是否有任何工具/名声可以帮助在没有事件采购的复杂部分的情况下进行 cqrs(事件观察者、命令处理程序)。
谢谢
我最近阅读了很多关于 CQRS 的内容,对我来说,它似乎与事件溯源密切相关。
但是就像这个答案所说的https://stackoverflow.com/a/9217461/277067 对我来说,事件源对于像我这样的初学者来说似乎有点过于复杂/可怕(“什么?我的对象当前状态不会存储在任何地方??”) .
所以我想知道他们是否确实被捆绑了,或者是否有任何工具/名声可以帮助在没有事件采购的复杂部分的情况下进行 cqrs(事件观察者、命令处理程序)。
谢谢
简短回答:不,CQRS 和事件溯源没有相互关联。
长答案:不,CQRS 和事件溯源没有相互关联,它们也没有与域驱动设计 (DDD) 关联。
如果你想用几句话来定义 CQRS、事件溯源和 DDD 是什么,你可能会想出以下解释(当然,它们过于简化了,但这正是这里的重点):
他们每个人在没有其他人的情况下都能很好地工作。例如,您可以使用 DDD 对域进行建模,然后在没有 CQRS 或事件源的情况下实现它。您也可以在不需要 DDD 或 CQRS 的情况下进行事件溯源。等等……</p>
但是:这三个概念很好地结合在一起,这就是为什么它们经常在一个句子中被称为。所以,不,它们没有相互联系,但它们相互结合很有意义。
下图显示了它们如何相互交互:
(图片取自wolkenkit 的文档,这是一个用于 JavaScript 和 Node.js 的 CQRS 和事件源框架。)
您可以在没有事件溯源的情况下使用 CQRS。在命令处理程序中,您正在使用一些存储库来获取或保存聚合根的最后状态。只需实现简单的存储库,它将直接从数据库保存和加载状态。
不,他们没有被 IMO 捆绑,你可以在这里找到我对相关问题的理由
简而言之,我应该说:我们可以在没有事件源的情况下拥有 CQRS。但是没有 CQRS,我们就无法进行事件溯源。一般来说,我们有 3 种类型的 CQRS:标准、事件溯源和最终一致性。
CQRS 和 EventSourcing 是相互独立的。但是根据需要,我们可以将它们结合起来,取得很好的效果。
让我们举一些例子:
CQRS(没有事件源):
电子商务负载均衡器:大多数对电子商务网站的请求都是获取请求,用户将在其中浏览可用的产品。并且有些卖家会更新这些产品和相关信息,但不会频繁更新,而是批量更新。该卖方请求可以从一台服务器提供服务,而用户请求可以从其他服务器提供服务。这两个服务器都从同一个数据库(单点源)获取/更新数据。这里没有事件溯源。但是我们能够在负载均衡器级别拆分读写。
数据库主/从:有时如果数据库吞吐量很高,我们可以使用从属来处理读取请求。在这里,我们再次能够在没有事件源的情况下拆分读写逻辑。
EventSourcing(没有 CQRS):