CNode

急问!!使用net+cluster模块创建的tcp服务端如何使用redis共享Socket???

问答
BBrotherPeng发布于12 年前最后回复12 年前9 回复4863 浏览0 收藏

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

查看回复

回复 (8)

M
MiguelValentine#1·12 年前

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

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

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

process.send({ foo: 'bar' });
B
BrotherPeng#2·12 年前
引用 MiguelValentineJSON.parse 中 function是不能被共享的。 单进程对应单SOCKET即可。跨进程分享SOCKET是画蛇添足吧? 如果一定要实现进程间通信 process模块和child pro...

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

B
BrotherPeng#4·12 年前
引用 MiguelValentine@BrotherPeng 如何区分A和B的连接?

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

B
BrotherPeng#5·12 年前

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

M
MiguelValentine#6·12 年前
引用 BrotherPeng@MiguelValentine 是啊,不知道有没有socketid之类的

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

但是我有解决思路。

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

B
BrotherPeng#7·12 年前
引用 MiguelValentine@BrotherPeng 知道你的意思了。socketio也不支持CLUSTER多核。 但是我有解决思路。 process模块 A的进程向主线程抛出一个任务类似 {do:'send',user...

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

参与回复
登录后即可参与回复。登录