如何在轴突中实现读取查询模型和写入命令模型之间的完全一致性

问题描述

我有2个spring-boot服务,分别充当命令和查询,如下所示。

  1. Command-Service:负责处理命令,事件,维护聚合状态并将数据存储到数据库中。
  2. 查询服务:负责处理查询以便从数据库获取数据。

请注意,这两个服务都共享相同的轴突服务器实例和相同的数据库(在本例中为ElsaticSearch)。

我的UI的设计方式是,当用户提交表单以创建数据时,会发生ajax调用,该调用依次按以下顺序执行2个rest调用

  1. 一个调用一个发布请求,该请求转到Command-Service,执行以下操作:
    • 使用formdata创建一个CreateDataCommand对象,并执行以下操作:
    org.axonframework.commandhandling.gateway.CommandGateway.sendAndWait(CreateDataCommand);
    
    • CreateDataCommand是在触发DataCreatedEvent的聚合中处理的:
    @CommandHandler
    private DataAggregate(CreateDataCommand createDataCommand  ) {
       AggregateLifecycle.apply(new  DataCreatedEvent ());
    }
    
    • DataCreatedEvent在2个地方处理,
      1. 在聚合本身中,聚合更新其状态:
      @EventSourcingHandler
      private void on(AppCreatedEvent appCreatedEvent) {
         // updated aggregate's state
      }
      
      1. 在Projection中,它将数据保存到数据库中。
      @EventHandler
      private void on(AppCreatedEvent appCreatedEvent) {
        // Saves data to database.
      }
      
  2. 成功执行以上操作后,ajax会立即向Query-Service发送一个get请求,该请求将执行以下操作:
    • 触发GetDataQuery查询,如下所示:
      org.axonframework.queryhandling.QueryGateway.query(GetDataQuery,ResponseType);
      
    • GetDataQuery的处理方式如下:
      @QueryHandler
      List<Data> getData(GetDataQuery getDataQuery){
        // hits the databse and returns data.
      } 
      

问题: 即使通过Command-Service将数据保存到数据库中,也会触发对Query-Service的调用,并且该调用始终返回空列表。在第二次调用之后,它将返回正确的数据。之所以发生这种情况是因为Query-Service在Command-Service完成在数据库中的数据创建之前就已经命中数据库

ajax脚本:

    $.ajax({
        type: "POST",url: "directs to Command-Service to save data",data: formData,contentType: false,processData: false,cache: false,timeout: 60000,enctype: "multipart/form-data",success: data => {
            setTimeout(() => location.replace("url of query-service"),1000);
        }
});

有人可以帮我实现完全一致性,还是找到一种方法来消除由于上述现象而引起的不一致。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)