【发布时间】:2020-12-08 00:23:55
【问题描述】:
我们遇到了一个问题,即每隔一段时间,我们的一个环境中的一个节点应用程序会在 100% 的 CPU 上运行。服务器不是很活跃,通常在 0%-2% CPU 上运行。我想知道可能导致此问题的常见问题是什么,以及找出导致此问题的原因的最佳方法是什么。
服务器端代码如下
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var mongo = require('mongodb');
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://127.0.0.1:27017";
const fs = require('fs');
var port = process.env.PORT || 3110;
io.on('connection', function (socket) {
console.log("connected");
MongoClient.connect(url,{ useUnifiedTopology: true }, function (err, db) {
socket.broadcast.on('getMessages', function (msg) {
var dbo = db.db("Hitesh");
if (err) throw err;
console.log(msg)
dbo.collection(msg["collectionName"]).find({ "roomId": msg["roomId"] }).sort({ $natural: -1 }).limit(parseInt(msg["limit"])).skip(parseInt(msg["total"])).toArray(function (err, result) {
if (err) throw err;
result.slice().reverse().forEach(element => {
io.to(socket.id).emit(msg["roomId"], element);
});
//db.close;
});
});
socket.broadcast.on('getMessages_once', function (msg) {
// MongoClient.connect(url,{ useUnifiedTopology: true }, function (err, db) {
var dbo = db.db("Hitesh");
if (err) throw err;
console.log(msg)
dbo.collection(msg["collectionName"]).find({ "roomId": msg["roomId"] }).sort({ $natural: -1 }).limit(parseInt(msg["limit"])).skip(parseInt(msg["total"])).toArray(function (err, result) {
if (err) throw err;
console.log(result.length);
io.to(socket.id).emit(msg["roomId"] + "_once", result.reverse());
// result.slice().reverse().forEach(element => {
// });
//db.close;
});
//});
});
//---- send message to from client--///
socket.broadcast.on('sendMessage', function (msg) {
//MongoClient.connect(url,{ useUnifiedTopology: true }, function (err, db) {
var dbo = db.db("Hitesh");
if (err) throw err;
dbo.collection(msg["collectionName"]).insertOne(msg["data"], function (err, res) {
if (err) throw err;
var messsageData = {
"roomId": msg["roomId"],
"messageId": msg["messageId"],
"collectionName": "conversations"
};
getMessageCount(messsageData);
console.log("1 document inserted");
msg["limit"] = "1";
msg["total"] = "0";
var val = { $set: msg["lastMessage"] };
var Ids = { "roomId": msg["roomId"] };
dbo.collection("conversations").findOneAndUpdate(Ids, val, { upsert: true }, function (err, res) {
if (err) throw err;
var FullArray = res["value"]["userList"];
FullArray.forEach(element => {
var someString = element;
someString["collectionName"] = "conversations";
MemberList(someString);
});
});
dbo.collection(msg["collectionName"]).find({ "roomId": msg["roomId"] }, { limit: 1 }).sort({ $natural: -1 }).toArray(function (err, result) {
if (err) throw err;
result.forEach(element => {
io.emit(msg["roomId"], element);
});
//db.close;
});
});
//});
});
//-- add user to database -----///
socket.broadcast.on('createUser', function (msg) {
console.log("createUser");
//MongoClient.connect(url,{ useUnifiedTopology: true }, function (err, db) {
var dbo = db.db("Hitesh");
dbo.collection(msg["collectionName"]).find({ "userId": msg["userId"], "title": msg["title"] }).toArray(function (err, result) {
console.log(result);
if (result.length == 0) {
dbo.collection(msg["collectionName"]).insertOne(msg, function (err, converRes) {
console.log(converRes);
//db.close;
});
}
else {
//db.close;
}
});
//});
});
// -------- create Room ----///
socket.broadcast.on('createRoom', function (msg) {
//console.log("createRoom");
// MongoClient.connect(url,{ useUnifiedTopology: true }, function (err, db) {
var dbo = db.db("Hitesh");
var dataObject = msg["data"];
var roomid = dataObject["roomId"];
dbo.collection(msg["collectionName"]).find({ "roomId": roomid }).toArray(function (err, result) {
if (result.length == 0) {
dbo.collection(msg["collectionName"]).insertOne(msg["data"], function (err, converRes) {
// console.log(converRes["insertedId"]);
io.emit('roomId', converRes["insertedId"]);
//db.close;
});
}
else {
//db.close;
}
});
// });
});
//---- get member list --////
socket.on('getChatUserList', function (msg) {
MemberList(msg);
});
function MemberList(msg) {
//MongoClient.connect(url,{ useUnifiedTopology: true }, function (err, db) {
var dbo = db.db("Hitesh");
if (err) throw err;
var nameTopost = msg["userId"] + "_" + msg["title"];
dbo.collection(msg["collectionName"]).find({ "userList.userId": msg["userId"], "userList.title": msg["title"] }).limit(parseInt(msg["limit"])).skip(parseInt(msg["total"])).toArray(function (err, result) {
if (err) throw err;
var userIdlist = [];
result.forEach(element => {
var someObject = element["userList"];
someObject.forEach(obj => {
userIdlist.push(obj)
});
});
dbo.collection("users").find({ $or: userIdlist }).toArray(function (err, userData) {
//console.log(userData);
var someData = {
"RoomList": result,
"userData": userData,
};
//console.log(someData);
io.emit(nameTopost, someData);
//db.close;
});
});
// });
}
///----- get total message count ----/////
socket.on('getTotalCount', function (msg) {
getTotalCount(msg);
});
///----- set total message count ----/////
socket.on('setTotalCount', function (msg) {
//MongoClient.connect(url,{ useUnifiedTopology: true }, function (err, db) {
var dbo = db.db("Hitesh");
var val = { $set: msg };
var Ids = { "totalCountId": msg["totalCountId"] };
dbo.collection(msg["collectionName"]).findOneAndUpdate(Ids, val, { upsert: true }, function (err, res) {
getTotalCount(msg);
});
//});
});
function getTotalCount(msg) {
//MongoClient.connect(url,{ useUnifiedTopology: true }, function (err, db) {
var dbo = db.db("Hitesh");
dbo.collection(msg["collectionName"]).find({ "totalCountId": msg["totalCountId"] }).toArray(function (err, result) {
io.emit(msg["totalCountId"], result[0]);
//db.close;
});
//});
}
socket.on('getMessageCount', function (msg) {
getMessageCount(msg);
});
function getMessageCount(msg) {
// MongoClient.connect(url,{ useUnifiedTopology: true }, function (err, db) {
if (err) throw err;
var dbo = db.db("Hitesh");
dbo.collection(msg["collectionName"]).find({ "roomId": msg["roomId"] }).toArray(function (err, result) {
io.emit(msg["messageId"], result[0]);
//db.close;
});
// });
}
socket.on('setMessageCount', function (msg) {
// MongoClient.connect(url,{ useUnifiedTopology: true }, function (err, db) {
if (err) throw err;
var dbo = db.db("Hitesh");
var val = { $set: msg["data"] };
var Ids = { "roomId": msg["roomId"] };
dbo.collection(msg["collectionName"]).findOneAndUpdate(Ids, val, { upsert: true }, function (err, res) {
//db.close
getMessageCount(msg);
});
// });
});
});
});
http.listen(port, function () {
console.log('listening on *:' + port);
});
.... ...... ... ... ... 我不确定是什么导致了这个问题
【问题讨论】:
-
您为每个关闭的连接创建的客户端如何?
-
在安卓和ios应用程序内,当应用程序进入后台然后关闭连接@D.SM
-
所以你没有关闭客户端?解释资源泄漏。
标签: javascript node.js mongodb sockets socket.io