首页 > 解决方案 > Axon - 如何在 CommandHandler 中检索新的实体版本号?

问题描述

我目前正在编写一个具有微服务架构的分布式应用程序。
为此,我在轴突框架的帮助下应用了 CQRS 模式和事件溯源。因此数据最终是一致的。
写入端和读取端都可以通过 HTTP 访问;特别是 REST。

最初的问题:
更新/创建实体后,用户 [1] 应该能够看到结果。因为事件是异步处理的,所以客户端/UI 不知道实体何时真正更新(或创建)。因此,当客户端在发送更新请求之后但在事件处理之前获取数据时,将返回未更改的数据。因此,用户可能会认为应用程序已损坏和/或发送新请求。

解决方案尝试:
在寻找写后读问题的解决方案时,我偶然发现了这个博客条目
建议在写响应中返回新的实体版本。然后,客户端可以使用预期的实体版本(作为预期标头)请求数据。如果实际版本等于或大于预期版本,则返回数据。否则返回一个带有Retry-After Header 的空响应。

问题:

当客户端向写入端发送 UpdateFoo 请求时,应用程序会通过 CommandGateway 发送相应的 UpdateFooCommand。该命令由发布 FooUpdatedEvent 的实体聚合处理。读取端接收此事件并更新其实体视图,该视图可通过读取端的 REST 接口访问。
这是由轴突框架控制的。@CommandHandler处理程序分别用和注释@EventSourcingHandler
现在:如何在CommandHandler中获取受影响实体的新版本号,以便在更新响应中返回该版本号?

提前致谢

[1] 不仅是用户。也可以有非人类客户。

标签: restcqrsevent-sourcingeventual-consistencyaxon

解决方案


您可以AggregateLifecycle.getVersion()在聚合中使用。您可以选择将该值作为命令结果的一部分返回,并在执行查询时传递该信息。如果查询还没有聚合信息的版本号,您可以(等待并)重试。


推荐阅读