java - Axon - 投影还是事件丰富器?

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

我有以下设置:

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

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

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

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

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

更新

我目前拥有的是:

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

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

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 的响应。

最佳答案

所以,@bojanv55,您试图欺骗您的应用程序以进行同步设置,而 Axon 框架的命令-事件-查询方法则强制您走另一条路。

理想情况下,您的前端应该符合这种情况。 因此,如果您到达发布命令的端点,那么您将立即执行并忘记。更新查询模型的事件将在发生时作为更新推送到前端。所以很快,接受异步的事实最终会让一切感觉更加无缝。

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

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

他所做的就是处理 REST 操作,并首先为您知道很快就会更新的内容调度订阅查询。 其次,命令被分派(dispatch)到聚合,聚合做出发布事件的决定,并且事件更新查询模型。 然后,查询模型更新构成向您的订阅查询发出的更新,使您仅在查询模型实际调整后才返回结果。

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

希望这对您有帮助!

关于java - Axon - 投影还是事件丰富器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54943123/

相关文章:

java - SAR 文件导致 Wildfly 10 中出现部署问题

domain-driven-design - 从域返回状态

domain-driven-design - DDD 和 CQRS/ES 不是打破了 DDD 的持久性不可知性吗?

java - 检查用户是否被另一个用户阻止的最佳位置

domain-driven-design - 事件溯源 - 如何恢复错过的事件

c# - 通过 Saga ID 而不是额外的聚合根来关联聚合

c# - CQRS 应用程序中的缓存失效

java - 如何让SAK使用JAVA识别智能卡类型?

java - 无法从 Eclipse 中动态 Web 项目的 Maven 依赖项导入类

java - 创建和访问 Vector 类