Java 轴突投射还是事件富集器?

Java 轴突投射还是事件富集器?,java,domain-driven-design,cqrs,event-sourcing,axon,Java,Domain Driven Design,Cqrs,Event Sourcing,Axon,我有以下设置: HTTP请求到达REST端点,我在应用程序服务中接收它 应用程序服务将请求映射到命令C1,并使用commandGateway.sendAndWait(新的C1(restPostBody))将其转发到聚合 从repo加载聚合,应用新命令,生成新事件并保存到存储 此时,我需要充实这个事件,并将其用作REST调用的响应 到目前为止,我可以看到以下选项: 使用视图投影仪,并投影新事件以创建视图模型,该模型可以作为REST调用中的响应转发。在这里,我需要使用queryGateway.sub

我有以下设置:

  • HTTP请求到达REST端点,我在应用程序服务中接收它
  • 应用程序服务将请求映射到命令C1,并使用
    commandGateway.sendAndWait(新的C1(restPostBody))将其转发到聚合
  • 从repo加载聚合,应用新命令,生成新事件并保存到存储
  • 此时,我需要充实这个事件,并将其用作REST调用的响应
  • 到目前为止,我可以看到以下选项:

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

  • 从聚合中发布事件后,使用一些事件enricher,并向其添加所需的属性,并将响应添加到REST调用。这类似于投影,但在这种情况下,我不会将其保存到DB,因为我需要数据的唯一时间是在发出命令时作为对REST端点的响应。这应该是完全同步的,因为如果出现故障,我将失去响应。在异步的情况下,我将需要聚合处理重复事件,并且仍然向事件enricher发送事件,但不存储到db。这似乎使事情变得非常复杂

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

    更新

    我目前的情况是:

    @Autowired
        public void configure(EventProcessingConfigurer configurer){
            configurer.usingSubscribingEventProcessors();
        }
    
    用于聚合和视图模型中的同步事件处理。然后我可以使用查询视图模型(看起来有点难看-有更好的方法吗?)


    我可以将这个
    SomeView
    作为restapi上的响应返回。

    因此,@bojanv55,您试图将您的应用程序伪装成一个同步设置,而Axon框架的命令事件查询方法强制您采取另一种方式

    理想情况下,您的前端应该符合这种情况。 因此,如果您到达一个发布命令的端点,那么您将进行一次触发并忘记。更新您的查询模型的事件将在发生时作为更新推送到前端。因此,很快,接受它是异步的这一事实,最终将使一切都变得更加无缝

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

    Frans的repository很好地展示了如何使用Axon框架实现这一点

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

    最后,我始终推荐我的第一个建议,即接受您所处的异步情况。第二,我认为我刚才共享的订阅查询解决方案也可以解决您所遇到的问题


    希望这能帮到你!

    谢谢你的评论。如果我使用
    使用SubscribingEventProcessor
    ,我想我不需要使用
    SubscribionQuery
    ,因为所有事情都是在同一个线程中完成的。如果我使用
    trackingEventProcessor
    ,这是唯一的选项。与跟踪处理器相关的问题->以防万一应用程序在保存聚合发出的事件和生成投影之间失败,投影会在组件重新启动时更新,还是会丢失此事件?您的假设是正确的。请注意,Axon Framework 4故意将事件处理器默认为跟踪。使用订阅,失败时丢失事件的可能性更大。T他
    TrackingEventProcessor
    使用
    TrackingToken
    跟踪处理事件流中事件的位置。未能处理事件可能发生在两个级别上,为了彻底解释这一点,我会说一个单独的问题。您介意专门为此添加一个吗?我是监督员所有轴突的问题,所以我一定会回答你。
    try {
                sc = queryGateway.query(new MyQuery("123", "123),
                        ResponseTypes.instanceOf(SomeView.class)).get();
            }
            catch (InterruptedException e) {
                e.printStackTrace();
            }
            catch (ExecutionException e) {
                e.printStackTrace();
            }