Validation CQRS+;微服务:如何处理关系/验证?

Validation CQRS+;微服务:如何处理关系/验证?,validation,relationship,one-to-many,microservices,cqrs,Validation,Relationship,One To Many,Microservices,Cqrs,场景: { "content": "my invoice content", "recipient": "42" } 我有2个微服务(都在内部使用CQRS+事件源) Microservice 1管理联系人(=聚合根) Microservice 2管理发票(=聚合根) 发票收件人必须是有效的联系人 CreateInvoiceCommand: { "content": "my invoice content", "recipient": "42" } 我现在读了很多次,写端

场景:

{
  "content": "my invoice content",
  "recipient": "42"
}
  • 我有2个微服务(都在内部使用CQRS+事件源)
  • Microservice 1管理联系人(=聚合根)
  • Microservice 2管理发票(=聚合根)
发票收件人必须是有效的联系人

CreateInvoiceCommand:

{
  "content": "my invoice content",
  "recipient": "42"
}

我现在读了很多次,写端(=命令处理程序)不应该调用读端


考虑到这一点,发票微服务必须监听所有创建的
联系人
和删除的
联系人
事件,以了解给定的收件人id是否有效

然后,我会在Invoices微服务中拥有数千个联系人,即使我知道其中只有少数人会收到发票


是否有处理这些场景的最佳实践

发票收件人必须是有效的联系人

这是一条商业规则。应该问一个问题,这个业务规则对我的应用程序意味着什么?谁应该负责执行这一规则,或者可以分担责任

一种可能性是,是的,业务规则是关于发票的,因此应该由发票服务负责实现它

然而,业务规则实际上是关于发票的创建。奇怪的是,在您的体系结构中创建发票的所有者不是发票服务。原因是命令名为
CreateInvoiceCommand

让我们考虑一下,发票服务永远不会自己创建发票。它只是提供了这种能力。在此体系结构中,发票创建的实际所有者是命令的发送者

使用这条推理路线,如果业务规则说发票创建不能针对无效收件人,那么命令发送者就有责任确保实现此业务规则

如果发票服务订阅了事件,而不是接收命令,那么这将是一个非常不同的场景。例如,一个名为
widgetsall
的事件。在这个场景中,发票创建的所有者显然是发票服务,因此业务规则将在那里实现

如果用户单击“为联系人42创建发票”按钮,则为 用户有责任确保联系人42的存在

是的,没错。用户的意图是创建发票。因此,关于发票创建的业务规则应在此时强制执行。这是如何发生的(或者这是否发生)是一个不同的问题

但是如果用户不在乎呢?然后它将创建一个发票 收件人id无效

也对。正如您所说,这种方法有一些副作用,其中一个副作用是您可能会在整个系统中得到不一致的数据。这是SOA的现实之一

这不是有点类似吗:发票上有一个货币代码 属性,它是一个字符串

我不知道我是否同意。请问这是有效的ISO货币吗?与询问实体42是否根据另一个系统有效不同?。我想是的

它不是有点像给定的收件人不是空的并且是有效的吗 根据我的联系人数据库

我同意,实际上,您可以在服务中实现这种验证。我只是说我不认为这是个合适的地方。如果您想这样做,您必须调用另一个服务或将所有联系人存储在本地,正如您最初提出的问题一样。我认为在服务之外做更简单

发票收件人必须是有效的联系人

这是一条商业规则。应该问一个问题,这个业务规则对我的应用程序意味着什么?谁应该负责执行这一规则,或者可以分担责任

一种可能性是,是的,业务规则是关于发票的,因此应该由发票服务负责实现它

然而,业务规则实际上是关于发票的创建。奇怪的是,在您的体系结构中创建发票的所有者不是发票服务。原因是命令名为
CreateInvoiceCommand

让我们考虑一下,发票服务永远不会自己创建发票。它只是提供了这种能力。在此体系结构中,发票创建的实际所有者是命令的发送者

使用这条推理路线,如果业务规则说发票创建不能针对无效收件人,那么命令发送者就有责任确保实现此业务规则

如果发票服务订阅了事件,而不是接收命令,那么这将是一个非常不同的场景。例如,一个名为
widgetsall
的事件。在这个场景中,发票创建的所有者显然是发票服务,因此业务规则将在那里实现

如果用户单击“为联系人42创建发票”按钮,则为 用户有责任确保联系人42的存在

是的,没错。用户的意图是创建发票。因此,关于发票创建的业务规则应在此时强制执行。这是如何发生的(或者这是否发生)是一个不同的问题

但是如果用户不在乎呢?然后它将创建一个发票 收件人id无效

也对。正如您所说,这种方法有一些副作用,其中一个副作用是您可能会在整个系统中得到不一致的数据。这是SOA的现实之一