我制作了简单的通知申请,订阅了redis频道,当它有新消息时,该应用程序会将其发送给用户。
client.on("auth", function(sessId, userId){
console.log('AUTH: userId ' + userId)
var userIdFromRedis;
redis1.get('PHPREDIS_SESSION:' + sessId, function (err , reply) {
if (reply){
reply = reply.toString();
var result = reply.match(/s:2:\"id\";i:(\d+);/);
if (result) {
userIdFromRedis = result[1]
console.log('AUTH: userIdFromRedis ' + userIdFromRedis)
} else {
result = reply.match(/s:7:\"guestId\";i:(\d+);/);
if (result) {
var guestIdFromRedis = result[1]
console.log('AUTH: guestIdFromRedis ' + guestIdFromRedis)
}
}
if (userIdFromRedis == userId) {
client.userId = userId;
subscribe.subscribe(channelPrefix + userId);
clients[userId] = client;
client.emit("auth", {"success":true});
console.log('AUTH: result - ok')
} else if (guestIdFromRedis) {
client.guestId = guestIdFromRedis;
subscribe.subscribe(channelPrefix + guestIdFromRedis);
clients[guestIdFromRedis] = client;
client.emit("auth", {"success":true});
console.log('AUTH: result - ok')
} else {
client.disconnect();
console.log('AUTH: result - fail')
}
} else {
client.disconnect();
}
});
})
subscribe.on("message", function(channel, message) {
var userId = Math.round(channel.substr(channelPrefix.length));
if (client.userId == userId || client.guestId == userId) {
console.log('Subscriber: ' + message)
client.send(message);
}
});
client.on("message", function(text){
client.send(text);
})
在日志文件中,有时在最后一小时我可以找到错误消息
(节点)警告:检测到可能的EventEmitter内存泄漏。 11 听众补充道。使用emitter.setMaxListeners()来增加限制。
node.js应用程序的进程使用90%的CPU。 请告知我如何解决这个问题?
答案 0 :(得分:1)
每当客户端连接到服务器时,都会向堆栈添加另一个EventEmitter。不幸的是,你没有关闭它们,所以你达到11的监听器限制。你应该追踪添加eventEmitters的代码片段然后再做一个声明,如果已经连接了一个客户端,那么就不应该有任何其他的发射器生成。