@ikerya

MongoDB: копятся активные подключения, что делать?

У меня есть сайт, реализован на NodeJS, база MongoDB, плагин Mongoose. В последнее время сайт стал падать примерно один раз в сутки. Недавно выяснил что это из-за нехватки памяти, которая возникает из-за того что копятся активные соединения (db.serverStatus().connections.current). Возможно это не связано, но у меня есть скрипт на NodeJS, который выполняется кроном каждую минуту. Там проверяется, есть ли в документах модел пост с текущей датой. Но я там закрываю mongoose соединение, не знаю в чем может быть проблема. Собственно содержимое файла:

process.env.NODE_TLS_REJECT_UNAUTHORIZED = 0;

const { new_time } = require("lib/functions");
const push = require("lib/push");

const apiCallback  = require("middleware/socket/apiCallback");

const mongoose = require("lib/mongoose");

const User = require("models/User");
const Post = require("models/Post");

(async () => {
    let currentPost = await Post.findCurrent(1);

    if (currentPost) {
        await currentPost.setPublished(1);

        await apiCallback.call({
            roomName: "index",
            event   : "posts.new",
            data    : {
                post: {
                    id: currentPost._id.toString()
                }
            }
        });
        await push.sendAll({
            // ненужные данные
        });
    }

    await mongoose.connection.close();

    process.exit(0);
})();

app.js:

const path           = require("path");
const express        = require("express");
const app            = express();
const bodyParser     = require("body-parser");
const cookieParser   = require("cookie-parser");
const expressSession = require("express-session");
const MongoStore     = require("connect-mongo")(expressSession);
const conf           = require("conf");
const mongoose       = require("lib/mongoose");

const expressSessionConfig = conf.get("session");

expressSessionConfig.cookie.expires = new Date(new Date().getTime() + 60 * 60 * 24 * 30 * 1000);
expressSessionConfig.store = new MongoStore({
    mongooseConnection: mongoose.connection
});

const templateDir = path.join(__dirname, conf.get("template_dir"));

app.engine("ejs", require("ejs-locals"));
app.set("views", templateDir);
app.set("view engine", "ejs")

app.use(express.static("frontend"));
app.use(cookieParser());
app.use(expressSession(expressSessionConfig));
app.use(bodyParser.urlencoded({
    extended: true
}));

require("routes")(app);

app.listen(conf.get("app_port"));

app.io.js (сокет сервер на socket.io):

const fs   = require("fs");
const path = require("path");
const app  = require("express")();
const bodyParser  = require("body-parser");
const apiCallback = require("middleware/socket/apiCallback");
const conf = require("conf");

const sslPath    = conf.get("sslPath");
const sslOptions = {
  key : fs.readFileSync(path.join(sslPath, "key.key")),
  cert: fs.readFileSync(path.join(sslPath, "crt.crt"))
};

const server = require("https").Server(sslOptions, app);
const io     = require("socket.io")(server);

app.use(bodyParser.urlencoded({
    extended: true
}));

app.use(conf.get("api_callback:path"), apiCallback.watch(io));

require("routes/socket")(io);

server.listen(conf.get("socket_port"));


routes/socket.js:

const { in_array } = require("lib/functions");
const loadUser     = require("middleware/socket/loadUser");

const User = require("models/User");

module.exports = io => {
    io.on("connection", async socket => {
        let query   = socket.handshake.query || {};
        let { ssid } = query;

        ssid = ssid || "";

        let user        = socket.user = await loadUser(ssid);
        let oldPageName = null;

        User.setOnline(user._id, 1);

        socket.on("setPageName", pageName => {
            if (oldPageName) socket.leave(oldPageName);

            oldPageName = pageName;
            socket.join(pageName);
        });
        socket.on("disconnect", () => {
            socket.leave(oldPageName);

            User.setOnline(user._id, 0);
        });
    });
};


Подскажите, как правильно закрывать соединения, чтобы они не оставались в памяти и не нагружали сервер до такой степени, что он убивает процесс демона MongoDB?
  • Вопрос задан
  • 212 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Abcdefgk
Реквайрить mongoose в этот файл (безо всяких выкрутасов) и написать mongoose.disconnect() в конце.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы