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

 Android代码 发布于 2023-01-07 18:55

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

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

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

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

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

我想确定是否有办法立即向所有客户发出?

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

或者这是Redis的案例?

1 个回答
  • 发布/订阅是您需要的.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的消息代理或者提供发布/订阅能力的类似网络库之类的东西.

    2023-01-07 19:00 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有