У меня запущено 3 набора реплик, и я также использую модуль кластера для форка 3 других процессов (количество созданных наборов реплик не имеет никакого отношения к числу разветвленных процессов).В методе mongoose connect
у меня установлена следующая опция
"use strict";
const mongoose = require("mongoose");
const config = require("../config.js");
// Set up mongoose connection
mongoose.connect( config.mongoURI, {
useNewUrlParser: true,
// silent deprecation warning
useCreateIndex: true,
// auto reconnect to db
autoReconnect: true,
// turn off buffering, and fail immidiately mongodb disconnects
bufferMaxEntries: 0,
bufferCommands: false,
keepAlive: true,
keepAliveInitialDelay: 450000,
// number of socket connection to keep open
poolSize: 1000
}, error => {
if (error) {
console.log(error);
}
});
module.exports = mongoose.connection;
Приведенный выше код находится в файле с именем db.js
.В моем server.js, который запускает экспресс-приложение, мне требуется db.js
.
Всякий раз, когда я перезагружаю веб-страницу несколько раз, доходит до того, что приложение резко замедляет загрузку (все это началось, когда я решил использовать набор реплик).Я подключился к mongdb через оболочку mongo и запускал db.serverStatus().connections
каждый раз, когда я перезагружал страницу, поле current
увеличивается (что ожидается при каждом новом подключении к mongodb), но проблема заключается в том, что текущее поле достигает указанногоpoolSize
приложение загружается много времени.Я пытался вызывать db.disconnect()
всякий раз, когда событие end
отправляется на экспресс-объект req
, который будет отключаться от mongodb (это работало, как и ожидалось, но, поскольку я использую поток, изменил вышеуказанное решение, чтобы закрыть открытые соединения, будет выброшено MongoError: Topology was destroyed
. Выданная ошибка - не проблема, проблема в том, что приложение не может резко замедлиться, если текущее открытое соединение достигает указанного значения poolSize.
Я также попытался установить maxIdleTimeMS
в строке подключения mongodb,и он не работает (возможно, mongoose не поддерживает его)
Примечание: всякий раз, когда я запускаю db.currentOps()
, все активные соединения устанавливаются на false