急问!!使用net+cluster模块创建的tcp服务端如何使用redis共享Socket???
发布于 2个月前 作者 BrotherPeng 292 次浏览 来自 问答

现在有一个问题,我要做A到B和B到A一对一的长连接通讯,使用net模块创建了服务器,又使用cluster做负载,现在不知道如何在进程间共享socket,想到了redis存储连接,但是在序列化socket的时候报错,请问有谁做过类似的功能啊??

9 回复

JSON.parse 中 function是不能被共享的。 单进程对应单SOCKET即可。跨进程分享SOCKET是画蛇添足吧?

如果一定要实现进程间通信 process模块和child_process模块你去看一看

process.on('message', function(m) {
  console.log('CHILD got message:', m);
});

process.send({ foo: 'bar' });

@MiguelValentine 现在是这样,A的连接由进程1管理,B的连接由进程2管理,如果我A给B发消息,服务器如何找到B呢?不知道我描述的是否准确。

@BrotherPeng 如何区分A和B的连接?

首先不要用cluster,用了肯定不行.因为长连接需要做sticky

参考文档吧:http://socket.io/docs/using-multiple-nodes/

@MiguelValentine 是啊,不知道有没有socketid之类的

@lonso 我没有使用websocket,要是websocket应该好说吧

@BrotherPeng 知道你的意思了。socketio也不支持CLUSTER多核。

但是我有解决思路。

process模块 A的进程向主线程抛出一个任务类似 {do:’send’,user:’B’,info:’balabala’} 所有线程收到这个事件,检索自己的连接池内是否存在用户B,存在则该连接池调动SEND方法,发送INFO数据。

@MiguelValentine 你的意思是主进程给所有子进程发消息,子进程在当前所有长连接内找到接收者是吧?可以试试,但是似乎redis作用不太大了,只有维护双方关系了

@BrotherPeng 你如果还想用REDIS,就要涉及到REDIS广播那块了。还不如我说这种方法的性能呢。

回到顶部