【问题标题】:Where should i put httpRequests in CQRS architecture using NestJs?我应该在哪里使用 NestJs 将 httpRequests 放在 CQRS 架构中?
【发布时间】:2020-06-11 08:50:45
【问题描述】:
我是 CQRS 和 DDD 的新手,并且正在使用 Nestjs 开发微服务架构,我遇到了这个问题,我正在努力一个 order 微服务,我通过控制器从客户端接收一个订单对象,并将它传递给 command 来处理它,但我需要首先检查数据是否附带的订单对象是否正确,所以我需要在其他微服务中检查它,因为我们不使用共享数据层,例如每个微服务都有自己的数据层(对象有一个客户端Id 和 Name 我需要使用 httpRequests 来检查客户端是否真的存在于微服务身份验证数据库中...在控制器层创建一个 checkService ?
我想知道最佳实践。
【问题讨论】:
标签:
domain-driven-design
microservices
nestjs
cqrs
【解决方案1】:
在使用微服务时发出同步 Web 请求并不是许多提供中间件服务的公司所设想的理想情况。原因是这引入了两个服务之间的时间耦合。如果您的依赖项已关闭或未提供服务,则您的请求将失败。
更好地遵循 DDD 的更好解决方案是考虑您拥有的实际流程并查看存在的责任。通常,当您这样做时,您最终会得到 BC 边界(转换为微服务 API 表面),这些边界更具凝聚力并且通常能够完全完成一个操作。
我从您在这里获得的极少信息中看到的三个选项是:
-
将处理分成两部分:
- 一部分接收“OrderRequestes”命令并根据您的业务需求对其进行验证,然后触发“OrderValidated”事件
- 系统的另一部分会接收“OrderValidates”事件并对其进行处理,并隐含假设那里的数据已经过验证
将您需要的数据子集的副本放入将处理订单请求的服务内部进行验证。如果在本地复制数据没有问题,如果数据有点陈旧也没有问题,这是一个非常自然的解决方案
如果您需要尽可能保持一致,请设计流程,以便执行订单处理的服务拥有它需要的数据,以便在处理之上进行验证.请注意,根据经验,虽然表面上人们会要求尽可能保持一致,但实际上这并不总是一个真正的问题,并且上述解决方案之一会更容易实施和支持。 (也想想如果您使用网络请求来验证订单,但在您返回验证结果之后,在订单被处理之前,发生了一些变化,因此订单将不再有效,那么您的情况会发生什么)