Axon-投影仪或事件增强器?

时间:2019-03-01 10:52:30

标签: java domain-driven-design cqrs event-sourcing axon

我有以下设置:

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

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

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

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

是否有与此相关的最佳做法?

更新

我目前所拥有的是:

@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();
        }

我可以返回此SomeView作为REST api上的响应。

1 个答案:

答案 0 :(得分:1)

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

理想情况下,您的前端应符合这种情况。 因此,如果您到达了发布命令的终点,那么您将大发雷霆而忘记了。更新查询模型的事件将在更新发生时被推送到前端。因此,不久之后,接受它是异步的事实,最终应该使一切都变得更加无缝。

但是,说起来容易做起来难;您问这个问题是有原因的。 我个人喜欢订阅查询(您也要指出)的用法,以欺骗操作使其变得同步。

我认为Frans的

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

他所做的是处理REST操作,然后 first 调度订阅查询,以了解您将很快更新的内容。 其次,将命令分派给聚合,聚合决定发布事件,然后事件更新查询模型。 然后,查询模型更新就构成了对订阅查询的更新,使您仅在实际调整查询模型后才返回结果。

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

希望这对您有所帮助!