具有多个Node.js主机的Socket.io,向所有客户端发出

时间:2014-06-24 18:30:57

标签: node.js websocket redis socket.io

我是Socket.io的新手,并试图找到解决此问题的最佳方法。

我们有四个在负载均衡器后面运行的Node.js应用程序实例。

我想要实现的是另一个应用程序将一些数据发送到负载均衡器URL,如果关闭到其中一个实例,它将进行处理。

接收实例将存储数据,然后使用Socket.io将数据发送到连接的客户端。

问题是浏览器/客户端一次只能连接到单个实例。

我正在尝试确定是否有办法立即向所有客户发光?

或者让客户端使用io.connect连接到多个服务器?

或者这是Redis的案例吗?

1 个答案:

答案 0 :(得分:5)

发布/订阅是您需要的。 Redis将为您提供开箱即用的功能。您只需创建一个redis客户端并在每个应用服务器节点上订阅更新通道。然后,在POST成功(或其他)时发布更新。最后,让redis客户端订阅更新chanel,并在消息上发出socketio事件:

(为简洁而截断)

var express = require('express')  
  , socketio = require('socket.io')
  , redis = require('redis')
  , rc = redis.createClient()
;

var app = express();
var server = http.createServer(app);
var io = socketio.listen(server);

server.listen(3000);

app.post('/targets', function(req, res){
  rc.publish('update', res.body);
});

rc.on('connect', function(){
  // subscribe to the update channel
  rc.subscribe('update');
});

rc.on('message', function(channel, msg){
  // util.log('Channel: ' + channel + ' msg: ' + msg);
  var msg = JSON.parse(msg);
  io.sockets.in('update').emit('message', {
    channel: channel,
    msg: msg
  });
});

然后在JS应用程序中,侦听发出的消息:

socket.on('message', function(data){
  debugger;
  // do something with the updated data  
});

当然,引入这个新的Redis Server会增加另一个单点故障。更强大的实现可以使用类似于AMQP或ZeroMQ的消息代理或类似的提供发布/订阅功能的网络库。