Return 实体由 axon 命令更新

Return entity updated by axon command

在使用命令改变实体后,获取实体更新表示的最佳方式是什么。

例如,假设我有一个像 digital-restaurant 这样的项目,我希望能够更新餐厅的一个字段并且 return 它是客户端进行更新的当前状态(到检索不同进程的任何修改)。

创建餐厅时,通过订阅 FindRestaurantQuery 并等待记录 return 发送创建命令后,很容易检索当前状态(即:投影表示) ]ed(参见 Restaurant CommandController

但是,检测 UpdateCommand 的结果何时应用于投影并不是那么简单。例如, 如果我们使用相同的技巧并订阅 FindRestaurantQuery,如果餐厅已修改,我们将收到通知, 但触发修改的可能不是我们的命令(在多个进程并发发出的情况下 更新命令)。

似乎有两种明显的方法可以检测给定更新命令何时应用于投影:

  1. 每个更新命令都有一个唯一的 ID。
    • 订阅命令 ID 应用于投影时更新的查询。
    • 将唯一 ID 传播到聚合所应用的事件
    • 当投影接收到事件时,它可以将当前状态通知给查询侦听器
  2. 在调度更新命令之前,查询投影的现有状态
    • 根据更新命令的内容计算目标状态

对于(1)的情况:是否存在携带唯一ID的事件可能存在的情况(例如:批处理/快照) 以某种方式跳过,阻止通知查询侦听器?

有没有更可靠/更惯用的方法来完成这个用例?

带有 Spring 引导的 Axon 4。

尽管出于多种原因可能更适合完全异步设计,但后端团队 forced 在异步 CQRS+ES 之上提供同步 REST API 是一种常见的情况后端。

试图解决此问题的演示应用程序部分 problem 位于此处 https://github.com/idugalic/digital-restaurant/tree/master/drestaurant-apps/drestaurant-monolith-rest

你说的情况完全成立。

我会选择选项 1。

我唯一担心的是您必须向域 (events) 引入新的 unique ID associated with every update command 属性。在我看来,这个 ID 属性没有任何 Domain/Business 值。已经有一个 Audit(who, when) 属性与每个 event 相关联,也许您可​​以使用它来关联命令和订阅。我相信这个解决方案有更多的价值(身份是域的一部分),如果这不是为了您的情况而放松的话。 请注意,在这种情况下,必须使用 Audit 扩展查询(您将知道谁请求了查询)