【问题标题】:Multi tenant (SAAS) using nodejs sequelize使用 nodejs sequelize 的多租户(SAAS)
【发布时间】:2017-11-22 22:52:32
【问题描述】:

我正在尝试使用 nodejs 和 postgres 构建一个多租户(/软件即服务),并作为 ORM 续集。出于安全原因,我决定为每个客户端使用单独的数据库,而不是让所有表都具有额外列的单个数据库。我取得了结果,但性能并不好,因为我必须根据 sequelize 为每个数据库初始化模型(几乎每个请求)。有没有更好的方法来做到这一点?我在续集中遗漏了什么吗?

【问题讨论】:

  • 使用具有单一数据库 (Postgres) 的池,您将拥有更好的可扩展性和更少的麻烦
  • 也许贴一些代码? FWIW,您应该只需要初始化一次模型(您绝对不需要在每次请求时重新定义它们)。如果您愿意,您可以保留单独的数据库 - 只需使用相关连接详细信息为每个数据库创建一个 sequelize 实例,并在应用启动时将您的模型定义传递给每个数据库。

标签: node.js postgresql sequelize.js multi-tenant saas


【解决方案1】:

我上面评论的快速实现。

app.js:

const Sequelize = require('sequelize');

const connections = {
  client1: new Sequelize('postgres://user:pass@example.com:5432/client1'),
  client2: new Sequelize('postgres://user:pass@example.com:5432/client2'),
  client3: new Sequelize('postgres://user:pass@example.com:5432/client3'),
};

const User = require('./models/user');
const Post = require('./models/post');
const Comment = require('./models/comment');

Object.keys(connections).forEach(connection => {
  connection.define('User', userColumns);
  connection.define('Post', postColumns);
  connection.define('Comment', commentColumns);
});

模型/user.js:

module.exports = {
  id: {
    type: Sequelize.INTEGER,
    primaryKey: true,
    autoIncrement: true
  },
  username: Sequelize.STRING,
  email: Sequelize.STRING
  // etc, etc
};

显然,无论您使用什么服务器框架,您都需要检测(从我想象的 url)哪个客户端连接用于给定请求。

或者,考虑编写一个单连接应用程序并部署它的多个实例(我目前正在这样做)。如果您设置在单独的数据库上,可能是一个更简单的选择。

【讨论】:

  • 此解决方案的可扩展性如何?如果我有数千个数据库,并为每个数据库创建一个实例怎么办?
  • @TFischer 这可能是您的数据库服务器的问题。 Node 转发这么多连接应该不会有问题,我无法想象 PG 会为它们提供服务。
  • PG 有默认的 100 个并发连接,其中三个是为超级用户连接保留的,虽然可以修改。 postgresql.org/docs/13/runtime-config-connection.html -- 更重要的是,如果同时使用 1000 个连接,可能会开始严重降低 PG 性能。
【解决方案2】:

我更喜欢 Postgres 中多租户的模式方法。我没有安全方面的权威,但它应该比基于表格的多租户更好。灾难恢复也应该比基于表的 MT 稍微容易一些,但仍然比使用单独的 DB 更糟糕。

我设法使用 ES6 代理在 Sequilize 中实现了这一点。这对您的 Node 版本提出了严格的要求,但如果您愿意至少使用 v6.9.2,您可以试试我的 lib:

https://www.npmjs.com/package/sequelize-multi-tenant-enhancer

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-28
    • 2014-03-13
    • 1970-01-01
    相关资源
    最近更新 更多