Validation 如何在基于CQRS和DDD的应用程序中使用补偿措施

Validation 如何在基于CQRS和DDD的应用程序中使用补偿措施,validation,domain-driven-design,cqrs,eventual-consistency,Validation,Domain Driven Design,Cqrs,Eventual Consistency,假设我们拥有两个微服务:realstate和Candidate 房地产服务负责管理租赁物业、房东等 Candidate服务提供申请租赁物业的命令 将有一个CandidateForRentalProperty命令,该命令需要RentalPropertyId和所有必要的Candidate信息 现在关键点是:不同类型的RentalPropertys需要一组不同的Candidate信息 因此,命令和聚合被拆分: 命令:candidateformarkinglot,CandidateForFlat,

假设我们拥有两个微服务:
realstate
Candidate

  • 房地产
    服务负责管理租赁物业、房东等
  • Candidate
    服务提供申请租赁物业的命令
将有一个
CandidateForRentalProperty
命令,该命令需要
RentalPropertyId
和所有必要的
Candidate
信息

现在关键点是:不同类型的
RentalProperty
s需要一组不同的
Candidate
信息

因此,命令和聚合被拆分:

  • 命令:
    candidateformarkinglot
    CandidateForFlat
    ,等等
  • 聚合:
    parkinglotcandidate
    flatCandidate
    ,等等
UI要求读取模型决定必须调用哪个命令

对我来说,验证
Candidate
信息以及
Candidate
域层中涉及的所有业务逻辑是合理的,但忽略验证是否根据给定的
RentalPropertyId
调用了正确的命令原因:此验证涉及多个聚合。

微服务应该是自治的,它的读取模型使用
不动产
域中的事件,因此不能保证它是最新的。我们不希望基于此拒绝候选人,而是使用最终一致性

是的,这可能导致用于某种
RentalProperty
Candidate
信息无效。有人可以使用停车场租赁物业id调用
CandidateForFlat
命令

但我们如何处理发生这种情况的情况呢?
不动产
域对
候选人
s一无所知

是否会有一个事件处理程序来检查是否存在错误,并执行适当的命令进行补偿


另一方面,这个“映射”是域逻辑,我想在域层中容纳它。但我不知道谁对这种补偿措施负责。是否会通知
候选人
聚合,如
不适用的应用程序类型
或诸如此类?

作为旁白-命令通常是命令动词。ApplyForFlat可能是比CandidateForFlat更好的拼写

你可能在这里寻找的模式是;当候选服务将CandidateForFlat消息与ParkingLot标识符匹配时,候选服务将发出一条消息作为输出,说“嘿,我们这里有个问题”

如果后续消息解决了问题--候选服务获得一条更新消息,该消息修复了CandidateForFlat消息中的标识符,或者候选服务从real estate获得一条更新,宣布标识符实际指向一个平面,那么候选服务可以发出另一条消息“没关系,问题已经解决了”


我倾向于在这种模式中发现,服务的输入命令实际上都是
句柄(事件)
的变体;用户提交,http请求到达;唯一的问题是微服务是否选择跟踪该事件。换句话说,“命令“流只是微服务订阅的另一个逻辑事件源。

作为旁白-命令通常是命令动词。ApplyForFlat可能是比CandidateForFlat更好的拼写

你可能在这里寻找的模式是;当候选服务将CandidateForFlat消息与ParkingLot标识符匹配时,候选服务将发出一条消息作为输出,说“嘿,我们这里有个问题”

如果后续消息解决了问题--候选服务获得一条更新消息,该消息修复了CandidateForFlat消息中的标识符,或者候选服务从real estate获得一条更新,宣布标识符实际指向一个平面,那么候选服务可以发出另一条消息“没关系,问题已经解决了”


我倾向于在这种模式中发现,服务的输入命令实际上都是
句柄(事件)
的变体;用户提交,http请求到达;唯一的问题是微服务是否选择跟踪该事件。换句话说,“命令“流只是微服务订阅的另一个逻辑事件源。

正如您所说,命令的验证应该在命令生成点执行-在客户端-读取模型可用

命令处理由聚合执行,因此它不能也不应该检查其他聚合的有效性或存在性。因此,它应该信任命令颁发者

如果命令来自不受信任的环境(如公共API),则API网关将成为客户端,并且它应该具有必要的读取模型来验证引用


如果您想快速接受命令并稍后进行检查,那么请记录ClientAppliedForParkingLot之类的事件,并通过保持其内部状态以及发出AcceptApplication或RejectApplication之类的命令来处理进一步的工作流。

正如您所说,命令的验证应该在命令生成点(在客户端)执行,在那里可以使用读取模型

命令处理由聚合执行,因此它不能也不应该检查其他聚合的有效性或存在性。因此,它应该信任命令颁发者

如果命令来自不受信任的环境(如公共API),则API网关将成为客户机,并且