如何在nodejs中可靠地维护连接的套接字数组



想象一个web套接字服务器。当我接收到一个连接时,我需要将该连接保存在它所属的连接池中(将该连接池想象成一个由"对等体"组成的"房间")。这是必需的,因为我需要向同一池的对等节点广播内容。

代码是-当然-所有异步的,即使Node是单线程的,似乎维护一个全局数组是不可靠的(我不确定这是怎么可能的,虽然…):在压力测试期间,消息流非常快的服务器,我保存结构中的连接,但通常下一个消息没有发现结构(仍然?)更新,行为不规律。

应用程序使用Redis,但是套接字无法序列化…

通信是基于WebSockets,通过SockJS(我使用Socket。

我确信这是一个众所周知且已经解决的问题,但我仍然不明白:我在这里错过了什么?

我的会话对象或多或少是类似的东西(多于伪代码…实际情况要复杂得多)。

var Sessions = {
   sockets: {},
   add: function(poolId, socket) {
     sockets[poolId].push(socket);
   },
   find: function(poolId) {
     return sockets[poolId];
   },
   remove: function ...
}

我不确定我理解您遇到的确切问题是什么,但这里有一个维护套接字池的服务器示例。一旦连接上,套接字就可以发送消息,这些消息只会被广播到它们分配的池,我相信这就是您想要实现的。另外,当客户端断开连接时,它将从池中删除自己。

var net = require('net'); 
var util = require('util');
var currentPool = 1;
var server = net.createServer();
//add a new socket to the assigned pool stored on the listening server instance
server.addToPool = function(s){
  if(!server.connPools){
    server.connPools = {};
  }
  if(!server.connPools[s.poolId]){
    server.connPools[s.poolId] = [];
  }
  server.connPools[s.poolId].push(s);
  s.on('close', clientCloseHandler);
  s.on('data', clientDataHandler);
};
//broadcast data from client to other clients in their pool
function clientDataHandler(data){
  for(var a=0; a < server.connPools[this.poolId].length; a++){
    server.connPools[this.poolId][a].write(data);
  }
}
//remove client form pool on disconnect
function clientCloseHandler(){
  var tmp = null;
  for(var a=0; a < server.connPools[this.poolId].length; a++){
    if(this.remotePort === a.remotePort){
      tmp = a;
      break;
    }
  }
  server.connPools[this.poolId].splice(tmp,1);
}
//add new client to pool
function newClient(s){
  s.poolId = currentPool;
  server.addToPool(s);
  if(currentPool === 1){
    currentPool = 2;
  }else{
    currentPool = 1
  }
}
server.on('connection', newClient);
server.listen(9999);

最新更新