Axon - 投影或事件丰富器?

我有以下设置:

  1. HTTP 请求到达 REST 端点,我在我的应用程序服务中收到它。

  2. 应用程序服务将请求映射到命令 C1 并将其转发到使用commandGateway.sendAndWait(new C1(restPostBody));.

  3. 从 repo 加载聚合,应用新命令并生成新事件并保存到存储。

  4. 此时,我需要丰富此事件并将其用作 REST 调用的响应。

到目前为止,我可以看到以下选项:

  1. 使用视图投影仪,并投影新事件以创建可以在 REST 调用中作为响应转发的视图模型。我在这里我需要使用queryGateway.subscriptionQuery(...sqr.updates().blockFirst()等待投影仪处理事件,然后创建响应。另外,我想这应该是同步的,因为如果系统在将事件存储到数据库和将投影存储到数据库之间失败,投影可能会不同步?

  2. 在从聚合发布事件后使用一些事件丰富器并向其添加所需的属性并添加对 REST 调用的响应。这类似于 Projection,但在这种情况下,我不会将其保存到 DB,因为我需要数据的唯一时间是在发出命令时对 REST 端点的响应。这绝对应该是同步的,因为如果出现故障,我会失去响应。在异步的情况下 - 我需要让 Aggregate 处理重复事件,并且仍然向事件丰富器发出事件但不存储到数据库。这似乎使事情变得复杂了很多。

是否有与此相关的最佳实践?


千万里不及你
浏览 142回答 1
1回答

LEATH

所以,@ bojanv55,你试图欺骗你的应用程序是一个同步设置,而 Axon 框架的命令事件查询方法强制你走另一条路。理想情况下,您的前端应该符合这种情况。因此,如果您到达发布命令的端点,那么您就会大火而忘记。更新查询模型的事件将在发生时作为更新推送到前端。所以很快,接受它是异步的事实应该最终会让一切感觉更加无缝。然而,说起来容易做起来难;你问这个问题当然是有原因的。我个人喜欢使用订阅查询(您也指向它)来欺骗操作以实现同步。我认为 Frans 的这个存储库很好地展示了如何使用 Axon Framework 做到这一点。他所做的是处理 REST 操作并首先为您知道很快会更新的内容发送订阅查询。其次,命令被调度到聚合,聚合做出发布事件的决定,事件更新查询模型。然后,查询模型更新构成向您的订阅查询发出的更新,允许您仅在查询模型实际调整后才返回结果。最后,我总是建议我的第一个建议是接受您所处的异步情况。其次,我认为我刚刚分享的订阅查询解决方案也可以解决您遇到的问题。希望这可以帮助你!
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java