能否同时使用REST、事件溯源和CQRS?

16

我了解REST和事件溯源的基础知识,但从未在严格的RESTful API或任何事件溯源项目中工作过。

请问是否可以同时使用这两种技术?

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

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

3个回答

9

有人能解释一下这两者是否可以一起使用吗?

可以。浏览器客户端会根据自己的需求进行操作,而http服务器则可以将这些操作记录为事件。

就像事件源(Event Sourcing)一样,客户端发送事件,这意味着在服务器上存在一个单一的事件集合,并且所有API的POST请求都将被添加到该集合中,以添加事件?

不是的。客户端可以是事件的发起者,但它不应该知道构成事件的内容,以防止基于那个事件集合的服务器和客户端之间的紧密耦合。事件源应该被封装并从演员隐藏起来。

客户端如何发现它可以向服务器发送哪些命令?

如果您不需要在与您在先前问题中提到的相同集合上发送事件,则无需这样做。您可以简单地以任何您想要的方式发布REST API,并将事件源从客户端/演员隐藏起来。请查看http://restdesc.org/


在什么情况下,将命令直接暴露给API客户端是可以接受的? - Erik Kaplun

5
REST是一种传输方式,它决定了应用程序的接口。您使用REST时通常采用即时一致性模型,但通过响应202 accepted命令,它也可以支持事件ual一致性模型。
事件溯源是一种通用的数据存储机制。通常情况下,您将事件溯源与领域驱动设计、命令和查询分离一起使用,并采用事件ual一致性模型,但它可能通过多阶段提交来支持即时一致性模型。
它们在应用程序中解决完全不同的问题,并且彼此兼容,因此您可以一起使用它们。
“正如事件溯源一样,客户端发送事件,这是否意味着服务器上有一个事件的单个集合,并且所有API的POST都将在该集合上进行,以添加事件?” 您完全误解了这个概念。您可以在事件存储中存储事件序列。事件是状态更改,因此,如果您存储应用程序的每个状态更改并按正确顺序重放它们,那么您可以重新创建应用程序的当前状态。这非常好,因为您可以通过重播事件并将其转换为数据库查询来简单地将数据迁移到另一个数据库。您可以使用常规数据库执行完全相同的操作以创建查询缓存。因此,您的客户端可以读取该查询缓存,而不必始终从头开始重新创建当前状态。
通常情况下,事件通常不是由客户端创建的。通过领域驱动设计,您的领域逻辑通过处理命令来创建领域事件。
“客户端如何发现可以发送到服务器的命令?” 通过REST,客户端使用链接将请求发送到REST服务。 REST服务可以处理这些请求并将其转换为命令和查询。命令由领域逻辑处理,并将导致引发领域事件。查询被转换为数据库查询,这些查询地址查询缓存。

2

简而言之,是的我们可以。你所列举的所有事情,包括REST、事件溯源(ES)和CQRS都是为了不同的目的而存在的。因此,我认为将它们全部综合起来并没有任何问题。

让我们来看看- REST是一种进行Web服务API的方式,ES是一种在域内进行通信的工具,而CQRS则是一种中级架构。

在ES中,客户端(如果我们谈论的是Web客户端)不会发送域事件。如果你指的是另一个有限上下文,并且该有限上下文是你的域的一部分,那么我想通过另一种方式来解决事件传输,比如一个服务总线之类的东西会很好。如果有限上下文不是你的域的一部分,那么你应该通过ACL和API来进行通信,而不是使用原始的域事件。:)

关于命令的简介。同样地,在CQRS中,命令存在于应用程序边界内。外部客户端(Web客户端、API客户端)不应直接发送应用程序命令。你应该提供一个API(内部客户端),允许执行某些服务用例,但不是单独的命令。你可以尝试回答一个非常流行的SO问题-当我们使用CQRS时如何检查用户名唯一性?:)


BC代表什么?有界上下文吗?你的回答包含了太多未解释的缩写! - Robin Green
@RobinGreen 是的,BC - Bounded Context。谈论ddd/cqrs/es的人应该熟悉这些缩写。我猜。 - masted
7
好的,我不是。请少做假设。 - Robin Green

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接