【问题标题】:Socket.io with multiple Node.js hosts, emit to all clients具有多个 Node.js 主机的 Socket.io,向所有客户端发出
【发布时间】:2014-06-24 18:30:56
【问题描述】:

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

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

我想要实现的是让另一个应用程序将一些数据发布到负载均衡器 URL,如果该 URL 将传递给其中一个实例。

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

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

我正在尝试确定是否有办法一次向所有客户端发出?

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

或者这是 Redis 的情况?

【问题讨论】:

标签: node.js websocket redis socket.io


【解决方案1】:

发布/订阅是您需要的。 Redis 将为您提供开箱即用的功能。您只需要创建一个 redis 客户端并订阅每个应用服务器节点上的更新通道。然后,在 POST 成功(或其他)时发布更新。最后,让 redis 客户端订阅更新通道并在消息上发出一个 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 的消息代理或提供发布/订阅功能的类似网络库之类的东西。

【讨论】:

  • 我们得出了与您上次评论类似的结论,将在 Kafka 上进行尝试。很好的答案。
猜你喜欢
  • 1970-01-01
  • 2015-04-05
  • 1970-01-01
  • 1970-01-01
  • 2020-08-19
  • 2018-01-15
  • 2019-08-04
  • 1970-01-01
  • 2017-08-17
相关资源
最近更新 更多