以下是我所拥有的代码的示例表示。我有一个UDP接收器,它可以连续接收非常大量的数据包。这是股市实时数据。这应该会对数据包的容量有所了解。
根据收到的数据,更新发送到Mysql DB,另一个发送到MongoDB。然而,这个代码会像任何东西一样泄漏内存,并且在具有7.5GB RAM的EC2机器上在大约12分钟内发生OOM错误。这次崩溃非常一致。
我阅读了几个有关Promise链接或递归调用Promises的内存泄漏的stackoverflow问题和github问题。我觉得我的代码不符合该描述,因此想知道这段代码是否也会导致内存泄漏。
当我将整个代码更改为无需Promise且仅回调时,内存消耗仅接近1%。完全没有泄漏。
我正在使用当前稳定版本的Node.js(v6.9.5 LTS)。使用本机Promise,没有像Bluebird等的库。
const dgram = require('dgram');
const receiver = dgram.createSocket('udp4');
const myObject = require('./myObject.js');
receiver.on('message', function(payload, sender) {
myObject.processPayload(payload);
});
receiver.bind(PORT);
// In mObject.js
var myObject = {
processPayload: function(payload) {
var updateDoc = doSomethingToPayload(payload);
// Mongo npm package offers APIs which return a Promise
var promise1 = this.mongoClient.collection('coll1').update(updateDoc);
var promise2 = this.getMysqlPromise(updateDoc);
Promise.all([promise1, promise2]).then(function(values) {
doSomethingElse();
}).catch(function(err) {
doErrorHandling();
});
},
// The mysql npm package does not offer APIs which return a Promise. Hence creating a Promise myself.
// The mysql2 package does. Tried that too and the same memory leak exists.
getMysqlPromise: function(updateDoc) {
var queryStatement = buildQueryFromUpdateDoc(updateDoc);
var self = this;
var promise = new Promise(function(resolve, reject) {
self.MysqlDB.query(queryStatement, function(err, results, fields) {
if (err) {
reject(err);
return;
}
resolve(results);
});
});
return promise;
}
}