Каков наилучший способ для приложения узла поддерживать соединение с сотнями или даже тысячами баз данных, используя mon goose? - PullRequest
1 голос
/ 20 апреля 2020

Я создаю мультитенантное приложение Saas. Многие посоветовали мне держать своих отдельных клиентов в отдельных базах данных, чтобы повысить безопасность и упростить управление.

Как нам подключить несколько баз данных к приложению Node?

Я знаю, как заставить мое приложение работать с одним подключением базы данных к mongodb, но не уверен насчет нескольких подключений.

Документ mon goose упоминает следующие решения для нескольких соединений:

  1. шаблон схемы экспорта (https://mongoosejs.com/docs/connections.html#multiple_connections) * соединение 1013 *
  2. пулы (у которых есть только до 5 подключений, которые могут быть не идеальными, поскольку в будущем у меня могут быть сотни клиентов)

Другой способ, который я пробовал (и он работает!), это подключение к mongodb во время вызова API узла и выполнения моей логики c, как показано ниже. Код ниже представляет собой тестовый маршрут для регистрации пользователя с именем и адресом электронной почты. dbutils () - это функция, которую я вызываю для подключения к mongodb, используя mon goose .connect (). Я не уверен, если это хорошая практика для подключения во время вызова API.

router.post('/:db/register', async (req,res, next) => {
  const startTime = new Date();


  try {
    if(!req.body.name) {
      throw new Error("Name required");
    }

    if(!req.body.email) {
      throw new Error("Email required");
    }

    await dbutils(req.params.db);// connect to db

    const session = await mongoose.startSession();
    session.startTransaction();


    const newUser = new User({
      name: req.body.name,
      email: req.body.email,
    })

    await newUser.save({session});

    await session.commitTransaction();
    session.endSession();

    const endTime = new Date();

    const diff = endTime.getTime() - startTime.getTime();

    return res.json({
      newUser: {
        email: req.body.email,
        name: req.body.name
      },
      db: req.params.db,
      timeElapsed: diff,
    });


  } catch(ex) {
    return next(ex);
  }



})

Мой код dbutils ()

const mongoose = require('mongoose');

const mongoURI = "mongodb://PC:27017,PC:27018,PC:27019";

module.exports = async function(db) {
  try {
    await mongoose.connect(
      `${mongoURI}/${db}`,
      {
        useNewUrlParser: true,
        useCreateIndex: true,
        useFindAndModify: false,
        useUnifiedTopology: true,
      }
    )
  } catch(ex) {
    throw ex
  }

}

Я был бы очень рад любой рекомендации или решению этой проблемы. Заранее большое спасибо за ваш ответ.

1 Ответ

0 голосов
/ 20 апреля 2020

Соединение с вашим DB в вызове API никогда не является хорошей идеей, вы будете тратить много ресурсов, а также отправлять ответы API.

Лучший способ для вы будете подключены к multiple databases при запуске приложения вместе с connection pooling конфигурацией.

Вы можете указать, какая схема принадлежит connection, и поддерживать отдельные коллекции DB.

Вы можете использовать приведенный ниже код для работы с несколькими соединениями и пулами:

const connection1 = mongoose.createConnection('mongodb://username:password@host1:port1[?options]',{
    poolSize: 10
});

const connection2 = mongoose.createConnection('mongodb://username:password@host2:port2[?options]',{
    poolSize: 10
});

Модели / схемы для соединения 1 могут быть созданы, как показано ниже:

//User schema on connection 1
const userSchema = new Schema({ ... });
const UserModel = connection1.model('User', userSchema);

module.exports = UserModel;

Модели / схемы в соединении 2 можно создать, как показано ниже:

//Product schema on connection 2
const productSchema = new Schema({ ... });
const ProductModel = connection2.model('Product', productSchema);

module.exports = ProductModel;

Для повышения производительности вы также можете иметь кластеры общих БД для каждой БД и используйте кластер для подключения к вашей базе данных.

const conn = mongoose.createConnection('mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]', options);

Для получения подробной информации, пожалуйста, прочитайте Пн goose Несколько подключений и Пул подключений

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...