Axon - 投影或事件丰富器?

Axon - Projection or event enricher?

我有以下设置:

  1. HTTP 请求到达 REST 端点,我在我的应用程序服务中收到它。
  2. 应用程序服务将请求映射到命令 C1 并将其转发到使用 commandGateway.sendAndWait(new C1(restPostBody)); 的聚合。
  3. 聚合从 repo 加载,应用新命令并生成新事件并保存到存储中。
  4. 这个时候,我需要丰富这个事件,作为REST调用的响应。

到目前为止我可以看到这个选项:

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

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

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

更新

我目前拥有的是:

@Autowired
    public void configure(EventProcessingConfigurer configurer){
        configurer.usingSubscribingEventProcessors();
    }

用于聚合和视图模型中的同步事件处理。然后我可以使用查询视图模型(看起来有点难看 - 有更好的方法吗?)

try {
            sc = queryGateway.query(new MyQuery("123", "123),
                    ResponseTypes.instanceOf(SomeView.class)).get();
        }
        catch (InterruptedException e) {
            e.printStackTrace();
        }
        catch (ExecutionException e) {
            e.printStackTrace();
        }

我可以 return 这个 SomeView 作为对 REST api 的响应 api。

所以,@bojanv55,您试图将您的应用程序欺骗为同步设置,而 Axon Framework 的命令-事件-查询方法迫使您采取另一种方式。

理想情况下,您的前端应该符合这种情况。 因此,如果你到达了一个发布命令的终点,那么你就会一发不可收拾。更新查询模型的事件将作为更新推送到前端。所以很快,接受它是异步的事实最终应该会让一切感觉更加无缝。

然而,说起来容易做起来难;你问这个问题当然是有原因的。 我个人喜欢订阅查询的用法,您也指出了这一点,以欺骗操作变为同步。

我认为 Frans 的

This 存储库展示了如何使用 Axon Framework 很好地做到这一点。

他所做的是处理 REST 操作,首先 为您知道很快就会更新的内容发送订阅查询。 其次,将命令分派给聚合,聚合决定发布事件,事件更新查询模型。 然后,查询模型更新构成向您的订阅查询发出的更新,只允许您 return 在实际调整查询模型后立即获得结果。

最后,我总是建议我的第一个建议接受您所处的异步情况。其次,我认为我刚刚分享的订阅查询解决方案也可以解决您遇到的问题。

希望对您有所帮助!