我是Socket.io的新手,并试图找到解决此问题的最佳方法。
我们有四个在负载均衡器后面运行的Node.js应用程序实例。
我想要实现的是另一个应用程序将一些数据发送到负载均衡器URL,如果关闭到其中一个实例,它将进行处理。
接收实例将存储数据,然后使用Socket.io将数据发送到连接的客户端。
问题是浏览器/客户端一次只能连接到单个实例。
我正在尝试确定是否有办法立即向所有客户发光?
或者让客户端使用io.connect连接到多个服务器?
或者这是Redis的案例吗?
答案 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的消息代理或类似的提供发布/订阅功能的网络库。