15

我了解 REST + 事件溯源的基础知识。我从来没有在严格的 RESTful API 上工作过,也没有在任何事件溯源项目中工作过。

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

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

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

4

3 回答 3

8

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

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

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

不可以。客户端可以是事件的发起者,但不应该知道什么构成了事件,以防止基于该事件集合的服务器和客户端之间的紧密耦合。事件溯源应该被封装并且对参与者隐藏。

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

如果您不需要像您在上一个问题中建议的那样在同一个集合上发送事件,则这不是必需的。您可以以任何您想要的方式简单地发布 REST API,并从客户端/参与者隐藏事件源。看看http://restdesc.org/

于 2013-06-22T18:45:57.483 回答
5

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

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

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

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

你完全误解了这个概念。您可以将事件序列存储在事件存储器中。事件是状态更改,因此如果您存储应用程序的每个状态更改并以正确的顺序重放它,那么您可以重新创建应用程序的当前状态。这非常好,因为您只需重播事件并将它们转换为数据库查询即可将数据迁移到另一个数据库。您可以使用常规数据库执行相同的操作来创建查询缓存。因此,您的客户可以读取该查询缓存,而不是总是从地面重新创建当前状态。

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

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

通过 REST,客户端使用链接将请求发送到 REST 服务。REST 服务可以处理这些请求并将它们转换为命令和查询。命令由域逻辑处理,并将导致引发域事件。查询被转换为寻址查询缓存的数据库查询。

于 2014-04-21T20:21:00.820 回答
2

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

您列举的所有事物,我的意思是 REST、事件源 (ES) 和 CQRS 用于不同的目的。所以我认为将它们全部放在一起没有任何问题。

让我们看一下——REST 是一种实现 Web 服务 API 的方法,ES 是一种在域内部进行通信的工具,而 CQRS 是一种中级架构。

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

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

于 2013-06-21T09:59:12.373 回答