我对 node.js 和 socket.io 都很陌生,但我正在尝试构建一个简单的服务,用于侦听 Redis 通知(由 PHP 应用程序提供),并将它们广播给当前登录、连接到套接字的所有用户.io 房间,例如'站点名称:用户:用户 ID'。
我可以正常工作,但 Node 应用程序的内存占用很快变得越来越大,很快就从 100mb 增加到 200+mb,大约有 100 个用户在线并积极浏览,我想知道我是否在这里设置有问题。
PM2 正在处理节点应用程序,并且 nginx 设置为反向代理。
服务器端:
var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);
var redis = require('redis');
var redisClient = redis.createClient();
var allClients = [];
server.listen(8890);
io.sockets.on('connection', function (socket) {
allClients.push(socket);
socket.on('subscribe', function(data) {
console.log('Joining room', data.room);
socket.join(data.room);
redisClient.subscribe(data.room);
})
socket.on('disconnect', function() {
console.log('Disconnect');
var i = allClients.indexOf(socket);
delete allClients[i];
});
});
// Watch for connection errors and log
redisClient.on('error', function (err) {
console.log('Error event - ' + redisClient.host + ':' + redisClient.port + ' - ' + err);
});
redisClient.on('message', function(room, message) {
console.log('New message: ' + message + '. In room: ' + room);
io.sockets.in(room).emit('message', message);
});
客户端:
// connect to socket
socket = io.connect('http://localhost:8890');
// subscribe to user's room once connected
socket.on('connect', function(data){
socket.emit('subscribe', { room: site_name + ':user:' + user_id });
});
// show messages from user's "room" via redis notifications
socket.on('message', function (response) {
var json = new Hash(JSON.decode(response, true) || {});
roar.alert(json.title, json.message, { link: json.link });
});
看起来这应该是一个非常精简的应用程序,不是吗?一个简单的 Node.js 应用程序的正常内存占用是多少?
服务器以 41mb 启动,但即使没有任何人连接到它,内存也会缓慢增加,大约每分钟 1mb。一旦我开始连接用户,它就会迅速膨胀到 200+mb,直到我将其杀死。
我不清楚当用户连接和断开连接时如何最好地处理 redisClient 和套接字连接,我认为这可能是问题所在。但看到它在闲置时爬行是令人不安的。
- PM2 v0.15.7
- 节点 v0.12.7
- 套接字.io v1.3.7
- 快递 v4.13.3
- nginx v1.6.2
非常感谢任何帮助。