Return 实体由 axon 命令更新
Return entity updated by axon command
在使用命令改变实体后,获取实体更新表示的最佳方式是什么。
例如,假设我有一个像 digital-restaurant 这样的项目,我希望能够更新餐厅的一个字段并且 return 它是客户端进行更新的当前状态(到检索不同进程的任何修改)。
创建餐厅时,通过订阅 FindRestaurantQuery
并等待记录 return 发送创建命令后,很容易检索当前状态(即:投影表示) ]ed(参见 Restaurant CommandController)
但是,检测 UpdateCommand 的结果何时应用于投影并不是那么简单。例如,
如果我们使用相同的技巧并订阅 FindRestaurantQuery
,如果餐厅已修改,我们将收到通知,
但触发修改的可能不是我们的命令(在多个进程并发发出的情况下
更新命令)。
似乎有两种明显的方法可以检测给定更新命令何时应用于投影:
- 每个更新命令都有一个唯一的 ID。
- 订阅命令 ID 应用于投影时更新的查询。
- 将唯一 ID 传播到聚合所应用的事件
- 当投影接收到事件时,它可以将当前状态通知给查询侦听器
- 在调度更新命令之前,查询投影的现有状态
- 根据更新命令的内容计算目标状态
对于(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
扩展查询(您将知道谁请求了查询)
在使用命令改变实体后,获取实体更新表示的最佳方式是什么。
例如,假设我有一个像 digital-restaurant 这样的项目,我希望能够更新餐厅的一个字段并且 return 它是客户端进行更新的当前状态(到检索不同进程的任何修改)。
创建餐厅时,通过订阅 FindRestaurantQuery
并等待记录 return 发送创建命令后,很容易检索当前状态(即:投影表示) ]ed(参见 Restaurant CommandController)
但是,检测 UpdateCommand 的结果何时应用于投影并不是那么简单。例如,
如果我们使用相同的技巧并订阅 FindRestaurantQuery
,如果餐厅已修改,我们将收到通知,
但触发修改的可能不是我们的命令(在多个进程并发发出的情况下
更新命令)。
似乎有两种明显的方法可以检测给定更新命令何时应用于投影:
- 每个更新命令都有一个唯一的 ID。
- 订阅命令 ID 应用于投影时更新的查询。
- 将唯一 ID 传播到聚合所应用的事件
- 当投影接收到事件时,它可以将当前状态通知给查询侦听器
- 在调度更新命令之前,查询投影的现有状态
- 根据更新命令的内容计算目标状态
对于(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
扩展查询(您将知道谁请求了查询)