我有一个相当简单的 Node.JS 应用程序,它使用订阅 redis 来接收消息,然后将这些消息发送给连接的客户端。此外,我还使用 subscribe 方法向 Node.JS 传递命令以向我们的用户发送电子邮件。
一切正常,但内存使用量每天都在增长,直到达到 1.1GB(在 linux 上使用命令 top),然后所有进一步的电子邮件发送都失败并显示错误消息:
{ [Error: spawn ENOMEM] code: 'ENOMEM', errno: 'ENOMEM', syscall: 'spawn' }
那是从哪里来的?源代码相当简单:
连接的客户:
io.sockets.on('connection', function (socket) {
nClients++;
console.log("Number of clients connected " + nClients);
socket.on('disconnect', function () {
nClients--;
console.log("Number of clients remaining " + nClients);
});
});
接收要发送给客户端的消息
cli_sub.on("message",function(channel,message) {
if(nUseDelay==1) {
oo = JSON.parse(message);
ablv_last_message[oo[0]["base"]+"_"+oo[0]["alt"]] = message;
} else {
io.sockets.emit('ablv', message);
}
});
向客户发送电子邮件
cli_email.on("message",function(channel,message) {
var transport = nodemailer.createTransport("sendmail");
oo = JSON.parse(message);
var mailOptions = {
from: email_sender,
bcc: oo["bcc"],
to: oo["recipient"],
subject: oo["subject"],
html: oo["text"]
}
try {
transport.sendMail(mailOptions);
} catch(err) {
console.log(err);
}
});
setInterval(function() {
Object.keys(ablv_last_message).forEach( function(key) {
io.sockets.emit('ablv', ablv_last_message[key]);
});
ask_last_message = [];
}, 5000);