在这种情况下,用于Saas或MultiTenant的Docker方法?

时间:2019-07-18 17:52:13

标签: node.js angular docker multi-tenant

我正在遵循我的SAAS应用程序的教程,这是链接:https://blog.lftechnology.com/designing-a-secure-and-scalable-multi-tenant-application-on-node-js-15ae13dda778

我根据自己的需要更改了应用程序,这就是我正在使用的方法,我的主数据库存储了所有租户及其特定的数据库连接。

当我的用户登录我的应用程序时,angular会存储用户的信息,以了解该用户是哪个数据库。

我有一个名为ConnectionManager的类,该类从用户返回数据库序列对象,这是该类

import Sequelize from 'sequelize';
import db from '../../sequelize.loadModels';

export default class ConnectionManager {
  constructor() {
    this.model = db;
  }

  async connectAllDb(slug) {
    try {
      const tenants = await this.model.sequelize.query(
        `
         SELECT * FROM tenants WHERE slug = '${slug}'
        `,
        { type: this.model.sequelize.QueryTypes.SELECT },
      ).then(response => response);

      const newDb = this.connectionDb(tenants[0]);
      return newDb;
    } catch (error) {
      throw error;
    }
  }

  connectionDb(tenants) {
    try {
      const options = {
        operatorsAliases: false,
        dialect: tenants.db_username,
        host: tenants.db_host,
        logging: false,
      };
      const databaseConfig = {
        db: {
          database: tenants.db_name,
          user: tenants.db_username,
          password: tenants.db_password,
          options,
          pool: {
            max: 5,
            min: 0,
            acquire: 30000,
            idle: 10000,
          },
        },
      };
      const sequelize = new Sequelize(
        databaseConfig.db.database,
        databaseConfig.db.user,
        databaseConfig.db.password,
        databaseConfig.db.options,
        databaseConfig.db.pool,
      );
      return sequelize;
    } catch (error) {
      throw error;
    }
  }
}

我在应用程序上为每个服务都有一个控制器,我将展示一些我只是为了测试而设计的控制器功能的一小部分示例

async login(req, res) {
    let response;
    const userData = req.body.user;
    const slugData = req.body.slug;

    const newDb = await this.connectionM.connectAllDb(slugData);
    const helper = new UserHelper(newDb);
    const tenant = await helper.getallUsers();
    response = res.status(HTTP_CODES.NOT_FOUND).json({ success: 0, message: 'User finded', Tenant: tenant });
    return response;

}

这是我的助手功能

export default class AuthHelper {
  constructor(newDb) {
    this.model = newDb;
  }

     async getallUsers() {
        try {

          const users = await this.model.query(
            `
             SELECT * FROM pb_users
            `,
            { type: this.model.QueryTypes.SELECT },
          ).then(response => response);

          /*
          const users = await this.model.user.findOne({
            where: {
              user_id: 1,
            },
            logging: console.log,
          });*/

          return users;
        } catch (error) {
          throw error;
        }
      }
}

工作正常,我设法做到了,但是我在考虑性能,这是一个好方法吗?每次用户向服务器发出请求时,我的服务器都会一下连接到主数据库,并从该用户那里提取数据并发出请求,我的应用程序将有20个用户,但是可以扩展,所以每次都有很多连接有问题吗?

我的应用程序中还有一件事情我今天在助手上使用了这种方法

const users = await this.model.query(
        `
         SELECT * FROM pb_users
        `,
        { type: this.model.QueryTypes.SELECT },
      ).then(response => response);

使用查询生成器,但我不希望自己想要在其他应用程序中使用它,就是这样:

const users = await this.model.user.findOne({
        where: {
          user_id: 1,
        },
        logging: console.log,
      }); 

使用模型,如何在不创建表的情况下使用sequelize创建模型?

0 个答案:

没有答案