账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    node使用websocket + redis发布订阅时的问题
    59
    0

    在写一个聊天程序,通过websocket发送信息,服务端收到信息,将信息存到redis中,触发pub发布事件,sub订阅事件,从redis中拿信息。

    // redis
    const redis = require("redis");
    const redisConf = require('../redis/conf').conf;
    
    // 发布者
    const pub = redis.createClient(redisConf);
    // 订阅者
    const sub = redis.createClient(redisConf); 
    
    function initSocket(WebSocket){
    
        // 引用Server类:
        const WebSocketServer = WebSocket.Server;
    
        // 实例化:
        const wss = new WebSocketServer({
            port: 3001
        });
    
        /**
         * 监听socket连接
         */
        wss.on('connection',function(ws,req){
    
            // redis订阅事件
            sub.on('message', function(channel, message) {
                
            })
                  
            ws.on('message', function incoming(message) {
               .. 先把message存redis中
               saveIntoRedis(message)
               
               // 发布通知
               pub.publish('sendMsg',JSON.stringify(message)) 
            }))
    
            /**
             * 断开连接
             */
            ws.on('close',function(){
           
            });
        });
    }
    
    module.exports = {
        initSocket
    }

    当我的pub和sub都定义在头部的时候,会出现一个bug,当我的socket断开重连后,每次订阅事件会重复触发2次,再重连socket,订阅事件会重复触发3次...依次类推。

    当我把sub的创建放到socket连接成功回调中,如下

    /**
         * 监听socket连接
         */
        wss.on('connection',function(ws,req){
            // 订阅者
            const sub = redis.createClient(redisConf); 
        })

    就正常了,是什么原因呢。

    1
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 單身夢 普通会员 1楼
      502 Bad Gateway

      502 Bad Gateway


      nginx
    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部