rest - Axon - 如何在 CommandHandler 中检索新的实体版本号?
问题描述
我目前正在编写一个具有微服务架构的分布式应用程序。
为此,我在轴突框架的帮助下应用了 CQRS 模式和事件溯源。因此数据最终是一致的。
写入端和读取端都可以通过 HTTP 访问;特别是 REST。
最初的问题:
更新/创建实体后,用户 [1] 应该能够看到结果。因为事件是异步处理的,所以客户端/UI 不知道实体何时真正更新(或创建)。因此,当客户端在发送更新请求之后但在事件处理之前获取数据时,将返回未更改的数据。因此,用户可能会认为应用程序已损坏和/或发送新请求。
解决方案尝试:
在寻找写后读问题的解决方案时,我偶然发现了这个博客条目。
建议在写响应中返回新的实体版本。然后,客户端可以使用预期的实体版本(作为预期标头)请求数据。如果实际版本等于或大于预期版本,则返回数据。否则返回一个带有Retry-After Header 的空响应。
问题:
当客户端向写入端发送 UpdateFoo 请求时,应用程序会通过 CommandGateway 发送相应的 UpdateFooCommand。该命令由发布 FooUpdatedEvent 的实体聚合处理。读取端接收此事件并更新其实体视图,该视图可通过读取端的 REST 接口访问。
这是由轴突框架控制的。@CommandHandler
处理程序分别用和注释@EventSourcingHandler
。
现在:如何在CommandHandler中获取受影响实体的新版本号,以便在更新响应中返回该版本号?
提前致谢
[1] 不仅是用户。也可以有非人类客户。
解决方案
您可以AggregateLifecycle.getVersion()
在聚合中使用。您可以选择将该值作为命令结果的一部分返回,并在执行查询时传递该信息。如果查询还没有聚合信息的版本号,您可以(等待并)重试。
推荐阅读
- android - 无法实例化以下类: - androidx.constraintlayout.widget.ConstraintLayout
- r - 为什么 R 代码可以在本地工作,但不能在 Docker 中运行?
- state-machine - 有没有办法在 xState 的层次状态节点中进行保护转换
- php - MAMP 上的 cURL 不工作,但相同的脚本在 Apache 的服务器上工作
- bash - 为什么在 VLC 的 DBus 中使用 Seek 方法会出现这么多错误?
- python - 将格式化为 Pandas DataFrame 的字符串转换为实际的 DataFrame
- python - 如何使用熊猫获取数据框列(具有字符串数组)中每个元素的频率?
- bash - 使用 Shell 脚本在新文件中打印带有一些文本的日期
- powershell - SharePoint Online 更改外观主题不起作用
- php - 如何使用正则表达式按字符拆分字母数字字符串?