在使用命令改变实体后获取实体的更新表示的最佳方法是什么。
例如,假设我有一个类似 digital-restaurant 的项目我希望能够更新餐厅的字段并将其当前状态返回给进行更新的客户端(以检索不同进程的任何修改)。
创建餐厅后,通过订阅 FindRestaurantQuery
并等待返回记录(请参阅Restaurant CommandController)
但是,检测 UpdateCommand 的结果何时应用于投影并不那么简单。例如,
如果我们使用相同的技巧并订阅FindRestaurantQuery
,我们将收到餐厅是否已修改的通知,
但可能不是我们的命令触发了修改(在多个进程同时发出的情况下)
更新命令)。
似乎有两种明显的方法可以检测给定更新命令何时应用于投影:
- 拥有与每个更新命令关联的唯一 ID。
- 订阅在命令 ID 应用于投影时更新的查询。
- 将唯一 ID 传播到聚合应用的事件
- 当投影接收到事件时,它可以通知查询监听器当前状态
- 在发送更新命令之前,查询投影的现有状态
- 根据更新命令的内容计算目标状态
在(1)的情况下:是否有任何情况(例如:批处理/快照)携带唯一ID的事件可能是 以某种方式跳过,阻止查询监听器收到通知?
有没有更可靠/更惯用的方法来完成这个用例?
带 Spring Boot 的 Axon 4。
最佳答案
尽管由于多种原因,完全异步设计可能更可取,但后端团队被迫
在异步 CQRS+ES 后端之上提供同步 REST API 是一种常见的情况.
演示应用程序中尝试解决此问题的部分位于此处 https://github.com/idugalic/digital-restaurant/tree/master/drestaurant-apps/drestaurant-monolith-rest
您提到的情况完全有效。
我会选择选项 1。
我唯一担心的是,您必须向域(事件
)引入与每个更新命令关联的新唯一 ID
属性。我认为此 ID
属性没有任何域/业务值(value)。已经有一个与每个事件
关联的Audit(who,when)
属性,也许您可以使用它来关联命令和订阅。我相信这个解决方案有更多的值(value)(身份是域的一部分),如果这不是为了让您的情况放松的话。
请注意,在这种情况下,查询必须通过Audit
进行扩展(您将知道谁请求了查询)
关于axon - 返回由 axon 命令更新的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57873076/