图数据库中的多租户架构

问题描述

我想与您分享我的想法并尝试获得一些建议。我想用最好的架构来定义我的应用程序。任何评论将不胜感激。来了……

我的技术: nestJs(Node)、neo4j/arangodb(graph DB)、Nginx for proxy(微服务方法)。

我的业务案例: SaaS 应用程序。许多客户拥有许多用户,每个客户一个数据库,我们的代码库使用相同的代码(只有一个实例)。
我们有一组对所有客户都相同的数据模型,但它们之间的关系会有所不同。根据我的研究,GraphDB 是此类操作的最佳匹配。所以我打算为每个客户创建单独的实例/数据库,否则关系过多会导致难以扩展。

问题:从我的角度来看,这个问题可以用两种不同的方法来看待。

  1. 我需要允许多个用户使用相同的代码同时连接到不同的数据库(只需安装一次)。在 nestjs App 中,如何更改每个 API 请求的数据库配置。我是否应该将 DB URI 保存在表中,根据用户/客户类型它将获取 DB URI?那么其他问题,比如它是否会影响延迟时间,如果任何请求失败,那么请求是否有可能从错误数据库获取数据?
  2. 我们如何在 neo4j/arangodb 中创建子图,以便我们可以根据客户获取子图。

另一方面,我发现了几个有趣的链接
https://neo4j.com/developer/multi-tenancy-worked-example/
https://www.arangodb.com/enterprise-server/oneshard/
https://dzone.com/articles/multitenant-graph-applications

有人可以向我提供更多信息吗?

感谢您的时间

最好的问候

解决方法

使用 ArangoDB,一个可行的解决方案是:

  • 为所有客户使用一个数据库
  • 在该数据库中使用 Foxx 微服务提供对所有数据的访问
  • 在每次调用 Foxx 时强制使用一个 tenantId 值
  • 为该数据库中的每个租户使用专用集合
  • 在 ArangoDB 前面设置一个 Web 服务器(例如 Node.js),为所有租户提供数据
  • 仅允许从该前端 Web 服务器连接到 Foxx

每个租户都需要一些集合,具体取决于您的解决方案,尽量保持该数量尽可能少。

此模型运行良好,您可以在实例/区域之间迁移客户,因为他们的数据是可移植的,因为它们位于集合中。