gpt4 book ai didi

node.js - 具有多个 Node.js 主机的 Socket.io,发送给所有客户端

转载 作者:可可西里 更新时间:2023-11-01 11:04:38 27 4
gpt4 key购买 nike

我是 Socket.io 的新手,正在努力寻找解决此问题的最佳方法。

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

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

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

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

我正在尝试确定是否有一种方法可以同时发送给所有客户端?

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

或者这是 Redis 的情况?

最佳答案

发布/订阅是您在这里所需要的。 Redis 将为您提供开箱即用的功能。您只需要在每个应用服务器 Node 上创建一个 Redis 客户端并订阅一个更新 channel 。然后,在 POST 成功(或其他)时发布更新。最后,让 redis 客户端订阅更新 channel 并在消息上发出一个 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 服务器会增加另一个单点故障。更健壮的实现可能会使用诸如带有 AMQP 或 ZeroMQ 的消息代理或一些提供发布/订阅功能的类似网络库。

关于node.js - 具有多个 Node.js 主机的 Socket.io,发送给所有客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24393809/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com