从轴突聚合调用第三方服务是个好主意

时间:2017-06-27 07:49:14

标签: spring axon

我有一个轴突聚合体。它处理命令并且在应用事件之前必须调用第三方服务来验证一些参数,根据此验证我是否应用事件。这是好习惯吗?或者我在发送命令之前进行了验证?

@Aggregate
public class SomeAggregate {
[...]
   @CommandHandler
   public void someHandler() {
     if(thirdPartyService.invoke) {
       apply(...)
     }
   }
}

2 个答案:

答案 0 :(得分:3)

如果它是非阻塞(域)服务,就像有限状态机一样,可以从聚合内部调用,因为它很可能很快就会完成。 但是,对我来说,“第三方服务”听起来像是一个外拨电话,这可能需要一些时间。

当Axon加载聚合时,它会阻塞聚合,因此没有其他线程可以更改它的状态/句柄命令。 第三方服务意味着聚合被阻止更长时间。

因此,我建议不要在您的汇总中调用第三方服务。 在输入汇总之前调用服务

答案 1 :(得分:0)

这取决于。如果您的第三方服务有副作用并且不是幂等的,那么我不确定该怎么做(我仍在努力弄清楚)。

如果确实有副作用,那么我希望聚合阻止/锁定并使用聚合的状态/历史记录来仔细管理这样的交互

@Aggregate
public class SomeAggregate {
[...]
   @CommandHandler
   public void someHandler() {
    /*
        Reason about whether its appropriate to send a request. 
        e.g. if a request has been sent but no response has been received,
        then depending on the third party service it might be in an indeterminate state.
        Instead of trying to interact with it, it might be better 
        to notify someone instead. 
    */
    rejectIfNotSafe()      

     /*
         Effectively locks this interaction / any other instances in the same path
         should get a concurrent modification exception when trying to commit this event.
     */
     commit(new ThirdPartyServiceRequested())

     if(thirdPartyService.invoke) {
       apply(...)
     }
   }
}

但是Axon的“工作单元”意味着,在命令处理程序完成之前,不会发布/提交发出的事件,所以我们不能以这种方式进行警惕。

有什么想法吗?