next. js и mongodb atlas - получение предупреждения «Соединения% от настроенного лимита превысили 80» - PullRequest
2 голосов
/ 15 апреля 2020

Я видел много постов и статей об этом предупреждении в MongoDB Atlas («Количество подключений% от настроенного лимита превысило 80»), но не смог понять, как решить его в моем приложении Next. js.

Я создаю свое соединение БД вне функции обработчика. Я использовал промежуточное ПО withDatabase.js:

const client = new MongoClient(process.env.MONGODB_URI, { 
    useNewUrlParser: true, 
    useUnifiedTopology: true 
});

const addDbToRequest = (handler, req, res) => {
    req.db = req.connection.db("MYDBNAME");
    return handler(req, res);
};

const withDatabase = handler => async (req, res) => {
    if (!client.isConnected()) {
        await client.connect();
    }
    req.connection = client;
    return addDbToRequest(handler, req, res);
};

export default withDatabase;

Это промежуточное ПО оборачивает обработчик конечной точки API.

Теперь, если я закрою соединение на каждом обработчике API по завершении, вот так:

    const { connection } = req;
    if (connection) {
        connection.close();
    }

Затем я получаю сообщение об ошибке во втором запросе к тому же обработчику API:

MongoError: Topology is closed, please connect

И если я не закрываю соединение, я получаю это оповещение (после непродолжительного использования) на мою электронную почту:

Connections % of configured limit has gone above 80

Как лучше всего работать с MongoDB Atlas в приложении Next. js?

Спасибо!

1 Ответ

1 голос
/ 30 апреля 2020

Соединение следует использовать повторно по следующим причинам:

  1. Медленное открытие и закрытие соединений с БД при каждом запросе API.
  2. Это вряд ли масштабируется. Предполагая, что вы делаете несколько запросов API для каждого пользователя, вы быстро достигнете того же лимита подключений, когда приложение получит больше пользователей.

Как мне управлять подключениями MongoDB в Node.js веб-приложение?

По умолчанию в конфигурации MongoClient максимальное число подключений на пул (poolSize) установлено на 5. Таким образом, вы не должны видеть более ~ 5 соединений в MongoDB Atlas, если у вас запущен только один экземпляр приложения и проверяется, подключен ли уже клиент, как вы.

if (!client.isConnected()) {
  await client.connect();
}

Обратите внимание, что Next. js "перезапускается" при каждом запросе в режиме разработки (next dev) и, похоже, влияет на кэш MongoClient и создает много соединений. Однако в производственном режиме вы не должны испытывать эту проблему.

...