What should I be using? Socket.io rooms or Redis pub-sub?

前端 未结 2 408
Happy的楠姐
Happy的楠姐 2020-12-12 11:52

Pretty simple question. I am building a realtime game using nodejs as my backend and I am wondering if there is any information available on which one is more reliable and w

2条回答
  •  天涯浪人
    2020-12-12 12:25

    I ended up writing a node plugin to allow for many pub-sub clients but only require 2 redis connections instead of a new one on every single socketio connection, it should work in general, figured someone else may find use for it.

    This code assumed you have socket.io running and setup, basically in this example any number of socket.io clients can connect and it will always still only use 2 redis connections, but all clients can subscribe to their own channels. In this example, all clients get a message 'sweet message!' after 10 seconds.

    Example with socket.io (utilizing redis pub-sub):

    var
        RPubSubFactory = require('rpss.js');
    
    var 
        redOne = redis.createClient(port, host),
        redTwo = redis.createClient(port, host);
    
    var pSCFactory = new RPubSubFactory(redOne);
    
    io.sockets.on('connection', function(socket){
        var cps = pSCFactory.createClient();
        cps.onMessage(function(channel, message){
            socket.emit('message', message);
        });
        io.sockets.on('disconnect', function(socket){
            // Dont actually need to unsub, because end() will cleanup all subs, 
            // but if you need to sometime during the connection lifetime, you can.
            cps.unsubscribe('cool_channel');
            cps.end();
        });
        cps.subscribe('cool_channel')
    });
    
    setTimeout(function(){
        redTwo.publish('cool_channel', 'sweet message!');
    },10000);
    

    Actual plugin code:

    var RPubSubFactory = function(){
    
        var 
            len,indx,tarr;
        var
            dbcom = false,
            rPubSubIdCounter = 1,
            clientLookup = {},
            globalSubscriptions = {};
    
        // public
        this.createClient = function()
        {
            return new RPubSupClient();
        }
    
        // private
        var constructor = function(tdbcom)
        {
            dbcom = tdbcom;
            dbcom.on("message", incommingMessage);
        }
        var incommingMessage = function(rawchannel, strMessage)
        {
            len = globalSubscriptions[rawchannel].length;
            for(var i=0;i
                    
                    0
                  
                       
                    
                   讨论(0)
                  
                                                      
                  
                  
提交回复
热议问题