【发布时间】:2012-08-12 11:25:41
【问题描述】:
我在nodejs中使用ws模块作为web socket服务器,代码的简化版是这样的:
var WebSocketServer = require('ws').Server
var wss = new WebSocketServer({port: 9001});
wss.on('connection', function (ws) {
// is the ws object created here ?
ws.on('message', function (message) {
if (message[0] === '+') {
ws.name = message.substring(1);
console.log(ws.name+' connected');
}
});
ws.on('close', function () {
console.log(ws.name+' disconnected');
// Will this ws object be deleted ?
});
});
我想知道:
- 在连接的每个事件中,是否都会创建一个 ws 对象?
- 每个连接的客户端是否有一个对象会一直保留在 RAM 中,直到它被垃圾回收?
最重要的是: 如果大量客户端断开连接并且 ws 对象一直存在直到它们被垃圾收集,那么当垃圾收集发生时,我的服务器可能会被锁定很长一段时间,对吗? 我是否应该将这些 ws 对象存储在另一个对象中,这样我就可以使用 delete 关键字并在收到关闭事件后立即删除它们?
如果我这样做,我的可能会有点像这样:
var WebSocketServer = require('ws').Server
var wss = new WebSocketServer({port: 9001});
var websockets = {};
wss.on('connection', function (ws) {
ws.on('message', function (message) {
if (message[0] === '+') {
ws.name = message.substring(1);
websockets[ws.name] = ws; // Add to the object that stores ws objects
console.log(ws.name+' connected');
}
});
ws.on('close', function () {
delete websockets[ws.name]; // Delete from the object
console.log(ws.name+' disconnected');
});
});
那么,值得吗?我是否在第二个 sn-p 中编写了对垃圾收集更友好的代码?当垃圾回收发生时,它是否有助于避免长时间锁定?
更新:很抱歉,我刚刚意识到第二个 sn-p 代码是多么愚蠢。当我做websockets[ws.name] = ws时,我实际上是在复制对象的数量......但问题的第一部分仍然有效。
【问题讨论】:
标签: node.js garbage-collection websocket v8