如何在 CQRS 中发送对命令的响应?

How to send response to a Command in CQRS?

我正在使用 Akka 持久性实现 CQRS 系统,我正在尝试了解 CQRS 的请求响应位。

SO 上关于如何将响应发送回客户端的答案很少,this article 也提到了一些好的模式。但是有人可以解释我应该如何在 CQRS 中为以下简单用例将响应发送回客户端,而不是使用大词进行概括。

用例

假设用户在显示用户个人资料的页面上显示以下信息

  1. 用户名
  2. 地址
  3. Phone个数

在我的系统中,每个用户都有一个 Actor,用于存储该用户的个人资料信息。

在 UI 用户想要更新地址并发生以下情况:

  1. 用户进行 AJAX REST 调用以更新用户地址
  2. UpdateUserAddressCommand(address:String) 生成
  3. UpdateUserAddressEvent(address:String) 生成
  4. UserAddressUpdatedEvent(updatedAddress:String) 已生成(更新了 UserActor 的状态)

现在如何在系统中发回 UserProfile 的完整状态?由于 CQRS 不鼓励发送对命令的响应?

关于 CQRS 模式,REST 层可以被认为是使用 CQRS 的系统的客户端,因此您可以发送响应(从 REST 服务器到 Web 浏览器)而不会违反 "principle".

你的情况很简单:

  1. /api/endpoint/1234 的 REST 调用 -> REST 服务器生成上述命令。
  2. 服务器 returns 代码“202 已接受”并将 Location: header 设置为 像 /api/user/profile/1234
  3. 客户端查询 /api/user/profile/1234 以查询 UserProfile.
  4. 的完整状态

如果你使用异步查询端 updates/eventual 一致性,你可以将 3. 与 HTTP 长轮询结合起来。