【问题标题】:Can we use REST + Event Sourcing + CQRS together我们可以一起使用 REST + 事件溯源 + CQRS
【发布时间】:2013-06-18 08:05:12
【问题描述】:

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

谁能解释一下两者是否可以一起使用?

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

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

【问题讨论】:

    标签: api rest domain-driven-design event-sourcing dddd


    【解决方案1】:

    谁能解释一下两者是否可以一起使用?

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

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

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

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

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

    【讨论】:

    • 在什么情况下可以将命令直接暴露给 API 客户端?
    【解决方案2】:

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

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

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

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

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

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

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

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

      【讨论】:

      • BC 代表什么?限界上下文?您的答案包含太多无法解释的首字母缩略词!
      • @RobinGreen 是的,BC - 有界上下文。说起 ddd/cqrs/es 的人应该对这些缩写很熟悉。我猜。
      • 好吧,我不是。请假设更少。
      猜你喜欢
      • 2016-02-20
      • 2019-01-31
      • 1970-01-01
      • 2018-11-15
      • 2019-09-22
      • 1970-01-01
      • 2014-04-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多