在ES / CQRS中获取第三方数据的最佳位置

时间:2016-03-08 15:16:35

标签: cqrs event-sourcing

我有一个RegisterUserCommand和一些用户数据。

为了能够向用户注册一些其他信息,我需要连接到第三方,所以我的问题是:

1)在调用时,Command是否已经拥有所有第三方数据?

2)如果CommandHandler连接到第三方并检索它会没问题吗?

3)我不认为我的聚合根应该这样做,但从某种意义上说,它是域逻辑。

我认为#2是最好的方式,但我想听听我是否出错?

(实际案例不是注册用户,但需要从远程服务/第三方获取数据)

2 个答案:

答案 0 :(得分:0)

(2)的问题是你的域层(命令处理程序肯定属于哪个)变得依赖于外部有界上下文。这打破了洋葱架构内层隔离。

对于某些情况,您的第一点基本上是正确的,如果您的服务层可以获取此数据并发送自包含命令,则这是可能的解决方案之一。

另一种解决方案是,您可以发送消息来启动流程管理器,该流程管理器将发送信息收集请求,获取数据并向处理程序发送包含所需信息的命令,而不是调用命令处理程序。由于这是通过异步消息传递发生的,因此您不会对第三方具有同步依赖性,并且即使第三方出现故障,您的应用程序仍将继续工作,至少在某种程度上,当第三方将被唤醒时,所有排队的请求将被处理。

通常,持久消息传递还具有一些重试功能,可以降低请求外部有界上下文失败的风险。

答案 1 :(得分:0)

您的第三方数据不属于您的域名,但是它是必需的,因此您可以拥有一个命令,该命令会导致请求数据"外部进程订阅的事件。然后,此过程可以收集所需的第三方数据并将其打包到另一个命令中,从而导致另一个事件表明提供的数据会导致您的查询数据更新。