我们可以一起使用REST + Event Sourcing + CQRS吗?

Seb*_*ber 11 api rest domain-driven-design event-sourcing dddd

我了解REST +事件采购的基础知识.我从未使用过严格的RESTful API,也没有参与任何Event Sourcing项目.

有人可以解释两者是否可以一起使用?

在事件源中,客户端发送事件,这是否意味着在服务器上有一个事件集合,API的所有POST都将在该集合上,以向其添加事件?

客户端如何发现它可以发送到服务器的命令?

Lod*_*rds 6

有人可以解释两者是否可以一起使用?

是.客户端(浏览器)只是做它想做的事情,(http)服务器可以将这些动作记录为事件.

在事件源中,客户端发送事件,这是否意味着在服务器上有一个事件集合,API的所有POST都将在该集合上,以向其添加事件?

不可以.客户端可以是事件的发起者,但不应该知道什么构成事件,以防止服务器和客户端之间基于事件集合的紧密耦合.事件采购应该被封装并且对于演员来说是隐藏的.

客户端如何发现它可以发送到服务器的命令?

如果您不需要在上一个问题中建议的同一集合上发送事件,则无需这样做.您可以以任何您想要的方式发布REST API,并隐藏来自客户端/ actor的事件源.看看http://restdesc.org/.


inf*_*rno 5

REST是一种交付方法,它决定了应用程序的界面.您主要使用REST与即时一致性模型,但它可以通过响应202接受命令来支持最终一致性模型.

事件源是一种通用的数据存储机制.您通常使用事件源和最终一致性模型以及域驱动设计,命令和查询隔离,但它可以通过多阶段提交支持立即一致性模型.

它们在您的应用程序中解决了完全不同的问题,并且它们彼此兼容,因此您可以将它们一起使用.

在事件源中,客户端发送事件,这是否意味着在服务器上有一个事件集合,API的所有POST都将在该集合上,以向其添加事件?

你完全误解了这个概念.您可以将事件序列存储在事件存储中.事件是状态更改,因此如果您存储应用程序的每个状态更改并以正确的顺序重放它,则可以重新创建应用程序的当前状态.这非常好,因为您可以通过重放事件并将其转换为数据库查询来将数据迁移到另一个数据库.您可以使用常规数据库创建查询缓存.因此,您的客户端可以读取该查询缓存,而不是始终从地面重新创建当前状态.

事件通常不是由客户创建的.通过域驱动设计,您的域逻辑可以通过处理命令来创建域事件.

客户端如何发现它可以发送到服务器的命令?

通过REST,客户端使用链接将请求发送到REST服务.REST服务可以处理这些请求并将其转换为命令和查询.这些命令由域逻辑处理,并将导致提升域事件.查询将转换为解决查询缓存的数据库查询.


mas*_*ted 2

简短的回答 - 是的,我们可以。

您所列举的所有内容,我的意思是 REST、事件溯源 (ES) 和 CQRS 都有不同的目的。所以我认为把它们放在一起没有任何问题。

让我们看一下 - REST 是一种实现 Web 服务 API 的方法,ES 是一种在域内通信的工具,CQRS 作为中层架构。

好吧,在 ES 中,客户端(如果我们谈论的是 Web 客户端)不会发送域事件。如果您指的是另一个有界上下文,并且该有界上下文是您域的一部分,我想应该通过另一种方式来解决事件传输,服务总线或类似的东西会很棒。如果有界上下文不是您域的一部分,您应该通过 ACL 和 API 而不是原始域事件来传达它。:)

关于命令的简短说明。同样,在 CQRS 中,命令位于应用程序边界内。外部客户端(Web 客户端、API 客户端)不应该能够直接发送应用程序命令。您应该提供一个 API(内部客户端),它允许执行某些服务的用例,但不允许执行单个单独的命令。对于一个自制的示例,您可以尝试获得一个非常流行的 SO 问题的答案 - 当我们使用 CQRS 时如何检查用户名唯一性?:)

  • 嗯,我不是。请假设更少。 (7认同)