使用nodejs、sequelize、postgresql进行多租户

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

我目前正在开发一个多租户项目。我们的团队决定每个租户都有自己的数据库,并且每个数据库中的表结构在所有租户中都是相同的。然而,我们在管理与每个租户数据库的连接方面面临着挑战。我们是否应该连接到所有租户的数据库并保持 Sequelize 连接打开?我正在寻找一种解决方案来有效管理项目的这方面。

我希望我能找到一个好的且简单的解决方案来实现这个

node.js postgresql sequelize.js multi-tenant
1个回答
0
投票

在每个租户都有自己的数据库的多租户架构中管理数据库连接确实会带来挑战,特别是在不消耗过多资源的情况下有效管理这些连接。以下是一些使用 Sequelize(一种流行的 Node.js ORM)有效处理此问题的策略和最佳实践:

  1. 动态连接管理

无需维护与所有租户数据库的持久打开连接,而是根据需要动态创建和关闭连接。这种方法最大限度地减少了资源使用并更好地扩展。

实施步骤:

  • 连接工厂:实现一个连接工厂来缓存连接并在可能的情况下重用它们。当连接尚未打开的租户收到请求时,工厂应该打开连接。
  • 连接池:利用Sequelize的内置连接池。此功能会自动管理连接池,根据需要打开新连接,并关闭空闲连接。
  • 连接缓存:维护具有超时机制的缓存,在一定时间内不使用的连接将自动关闭。这有助于有效管理资源。
  1. 基于环境的配置: 以可管理的格式(例如 JSON 或环境变量)存储每个租户的数据库配置,并根据租户标识符动态检索它们。

const tenantConfigs = {
  tenantA: { database: 'dbA', username: 'userA', password: 'passA', host: 'hostA' },
  tenantB: { database: 'dbB', username: 'userB', password: 'passB', host: 'hostB' }
};

动态检索和连接:

const Sequelize = require('sequelize');
const cache = new Map();

function getTenantConnection(tenantId) {
  if (cache.has(tenantId)) {
    return cache.get(tenantId);
  }

  const config = tenantConfigs[tenantId];
  const sequelize = new Sequelize(config.database, config.username, config.password, {
    host: config.host,
    dialect: 'mysql',
    pool: {
      max: 5,
      min: 0,
      acquire: 30000,
      idle: 10000
    }
  });

  cache.set(tenantId, sequelize);
  return sequelize;
}

  1. 连接清理 实施一种机制来关闭不再需要的连接或在设定的空闲时间后关闭连接。
© www.soinside.com 2019 - 2024. All rights reserved.