NestJs 设计问题:如何避免为每个团队创建一个 Nodejs 实例?

omi*_*idh 6 architecture database-design node.js typeorm nestjs

我使用NestJs和 Nodejs制作了一个 CRM 应用程序。我以每个团队都有自己的数据库的方式设计它,因为每个团队的数据都是不同的,并且与其他团队没有关系,而且它使备份过程变得更加容易。

但是,现在我想部署我的服务,我注意到对于每个团队,我必须创建一个单独的 nodejs 实例,这使得 ram 使用率非常高。想象一下,对于 10 个团队,我可能需要大约 500MB 的内存,即使在短期内,这也会在经济上伤害我。

解决方案

我在 NestJs 中使用了 TypeORM,所以我的第一个想法是找到一种方法让多个数据库(不是多个连接)共享相同的模式,但根据请求的范围和细节动态使用其中一个。这似乎是最好的解决方案,因此我可以避免创建另一个 NodeJs 实例,同时我现在为每个团队拥有单独的数据库。

我阅读了 nestJs 和 TypeORM 文档,但没有找到任何方法来实现它。所以我的另一个解决方案是只为everone 使用一个数据库,并team_id在每个表中添加类似列的内容,以便为每个团队制作过滤数据。

这是一个好方法吗?

是否有其他解决方案可以使用一个 nestJs 实例但对多个数据库使用相同的架构?

top*_*oon 6

我建议使用一个数据库。

数据库可以有一个表保存所有团队,其他表将有一个新team_id列,如您所想。

每个团队一个数据库有缺点。

  • 多个数据库连接

由于您需要Entities为团队的所有数据库使用相同的数据库,因此您不能使用Single Database Connection. 根据每个传入的 API 请求,服务器必须切换数据库连接。

  • TypeORM 中的数据库配置

对于多个数据库,配置将如下所示:


imports: [
    ...,
    TypeOrmModule.forRoot({
        name
        type
        host
        port
        username
        password
        ...
    }),
    TypeOrmModule.forRoot({
        name
        type
        host
        port
        username
        password
    }),
    ...
]
Run Code Online (Sandbox Code Playgroud)

如果您需要添加一个新团队,则必须更新代码库以便为团队添加新数据库,并且必须重新部署您的应用程序。(也许您将创建一个新数据库并执行迁移?)

  • 备份

我同意你的观点,最好用多个数据库备份一个团队。但是当你想备份所有团队时呢?在大多数情况下,我认为它需要备份所有团队,而不仅仅是特定团队。

  • 团队管理

你在哪里保存团队的信息?怎么知道哪个队有什么db?也许你保存在teams某个地方(在一个单独的数据库中?)。要知道每个请求应该使用哪个数据库连接,它需要进行新的查询吗?

  • 成本

如果有 100 个团队,你会制作 100 个数据库吗?每个应用程序也有developmentproduction环境。在某些情况下,可以有更多环境,例如staging. 2 envs 将使dbs 的数量增加一倍。


结论

当然,会有一种方法可以自动化上面列表中的某些项目,并且仍然可以在 NestJS + TypeORM 中为您的项目使用 multipe 数据库,但它看起来不是一个好方法,也不值得为您的项目付出努力。

我见过一些大型的多租户应用程序(如grafana),但它们没有使用multiple databases策略。


Dan*_*cci 0

我不知道你如何存储用户,但既然你谈论的是团队,我想你有一个存储用户并将其分配给团队的地方,它可能是登录公共数据库中的一个表吗?

解决方案可能是将每个团队绑定到自己的数据库;一旦用户登录(从公共登录数据库访问数据),您读取其所属的团队及其数据的数据库,然后您可以从与用户所属团队绑定的数据库访问CRM数据。