NestJS微服务架构中学生与用户的分离

问题描述 投票:0回答:1

我需要有关应在 NestJS 项目中使用的架构模式的帮助。

所以我使用命令/查询方法来开发我的 RestAPI。现在它是一个整体架构,而不是微服务架构,但我正在以一种明天可以轻松切换到微服务的方式开发它。

所以考虑一个场景,我有 2 个 API,一个是 createStudent,另一个是 createUser。 在我的应用程序中,我在 src users 和 Students 下有 2 个独立的文件夹,其中用户将处理与用户相关的所有内容,而学生将处理学生费用、出勤率等。 他们每个人都有自己的实体和存储库文件。

此外,创建学生还涉及创建用户的步骤。所以基本上来说,对于一个学生来说,将创建一个用户,其联系人和地址详细信息将被保存,instutres 详细信息将被保存,文档详细信息将被保存等。

考虑到这一点,创建用户、联系人和地址是用户文件夹的一部分,与这些相关的存储库文件和实体文件存储在用户文件夹中。

创建学生,为学生分配学院,插入文档,属于学生文件夹和存储库的一部分,与这些相关的实体文件存储在学生文件夹中。

现在我正在做的是,在 createStudent 处理程序中,我注入了用户、userAddresses 和 userContacts 的存储库,并在处理程序中使用它们来获取/创建/更新与用户、地址或联系人相关的记录。

虽然我也有一个单独的 createUser 处理程序,但最终我也需要做同样的事情,但这与学生无关。

我仍然能够做我需要做的事情,我只是在想,明天如果我切换到微服务方法,其中用户和学生将是具有不同数据库的不同微服务,我将无法注入存储库和以某种方式需要为用户或学生调用 Rest API 来实现此目的。

我这样做的方式正确吗?或者有没有一种方法可以让我从 NestJS 中的另一个处理程序调用一个处理程序,以便我可以将逻辑隔离在特定的处理程序中?

第二个想法是,如果用户和学生彼此联系如此紧密并且正在发生数据交换,是否应该将它们隔离到不同的微服务中?

node.js architecture microservices nestjs-microservice
1个回答
0
投票

因此,首先我们在这里讨论的并不是严格意义上的 CQRS 模式,而是域的设计。 “用户”从哪里结束,“学生”(也是“用户”)从哪里开始。逻辑的封装,诸如此类的东西。领域驱动开发说“你好”:)

首先要事。

现在我正在做的是,在 createStudent 处理程序中,我注入了用户、userAddresses 和 userContacts 的存储库,并在处理程序中使用它们来获取/创建/更新与用户、地址或联系人相关的记录。

我很确定这只能用一个存储库来处理。如果您为用户定义关系(1:M 地址),则数据层的任何突变都可以通过级联更新来完成:

let user = await this.userRepo.getOne(userId);
const newAddress = new Address({...});
user.addresses.push(newAddress);
await this.userRepo.save(user);

(当然,这是伪代码)。

我会想到一个通用规则,即每个 CQRS 处理程序始终保留一个存储库。如果某个存储库无法完成某些操作,则意味着该处理程序的范围太大(泄漏边界,用户的某些内容不应该对地址进行直接突变,这是一个单独的域)。


如果我切换到微服务方法,其中用户和学生将是具有不同数据库的不同微服务,我将无法注入存储库

默认情况下,

为什么有不同的数据库?您可以让微服务与唯一的数据层进行交互,这仍然有效,除非出于某些原因需要分离数据库。您可以让微服务完成自己的工作,根本不与数据层交互,而是通过消息总线接收所有内容,并通过消息总线响应负责数据处理的主应用程序。但是,如果您为 one 实体或模式注入存储库(如果您使用的是例如

mongoose
),并很好地定义您的关系,您仍然可以将单个存储库(绝对推荐)注入到微服务中,并且级联会起作用。

但是,如果您会说“但我需要拥有多个存储库”,那么这意味着域边界很可能应该重新考虑:)

© www.soinside.com 2019 - 2024. All rights reserved.