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