Node.js 使用nodejs sequelize的多租户(SAAS)

Node.js 使用nodejs sequelize的多租户(SAAS),node.js,postgresql,sequelize.js,multi-tenant,saas,Node.js,Postgresql,Sequelize.js,Multi Tenant,Saas,我正在尝试使用nodejs和postgres构建一个多租户(/软件即服务),续集为ORM。出于安全原因,我决定为每个客户机使用单独的数据库,而不是使用单个数据库,所有表都有额外的列。我获得了结果,但性能并不好,因为我必须根据sequelize(几乎每个请求)为每个DB初始化模型。有没有更好的办法?我在sequelize中遗漏了什么吗?上述评论的快速实现 app.js: const Sequelize = require('sequelize'); const connections = {

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

上述评论的快速实现

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);
});
models/user.js:

module.exports = {
  id: {
    type: Sequelize.INTEGER,
    primaryKey: true,
    autoIncrement: true
  },
  username: Sequelize.STRING,
  email: Sequelize.STRING
  // etc, etc
};
显然,无论您使用什么服务器框架,您都需要(从我想象的url)检测用于给定请求的客户端连接


P>可选地,考虑编写单个连接应用程序并部署多个应用程序(我现在正在这样做)。如果设置为单独的数据库,可能是一个更简单的选择。

我更喜欢模式方法,而不是Postgres中的多租户方法。我不是安全方面的权威,但它应该比基于表的多租户更好。灾难恢复也应该比基于表的机器翻译稍微容易一些,但仍然比使用单独的数据库更糟糕

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


使用带有单个数据库的池(Postgres)您将拥有更好的可扩展性和更少的头痛问题可以发布一些代码吗?FWIW,您应该只需要初始化一次模型(您绝对不需要在每次请求时重新定义它们)。如果愿意,您可以保留单独的数据库-只需使用相关的连接详细信息为每个数据库创建一个sequelize实例,并在应用程序启动时将您的模型定义传递给每个数据库。此解决方案的可伸缩性如何?如果我有数千个数据库,并为每个数据库创建一个实例,该怎么办?@TFischer这可能是数据库服务器的一个问题。节点转发这么多连接应该不会有问题,我也无法想象PG在服务这些连接时会有问题。PG默认有100个并发连接,其中三个是为超级用户连接保留的,尽管可以修改。-但更重要的是,如果同时使用1000个连接,可能会严重降低PG性能。