2

私は socket.io を使用してリアルタイムの投稿に取り組んでいます。

ストリームはリアルタイムで更新されますが、問題は redis サブスクリプションが複数回発生し、投稿がストリームに複数回表示されることです。

node.jscluster moduleを使用して複数のノード クラスターを作成しています。ここにコードがあります、

worker.js

var cluster    = require('cluster');
var server     = new Hapi.Server(config.port,view_options);

var socketIO   = require('socket.io');
var redis      = require("socket.io/node_modules/redis");
var RedisStore = require('socket.io/lib/stores/redis');

var io         = socketIO.listen(server.listener);
var sub        = redis.createClient();
sub.setMaxListeners(0);

io.configure(function() {
    io.set('store', new RedisStore({
        redisSub : sub
    }));
    io.set('transports', ['xhr-polling']);
    io.set('polling duration', '10');
});

if (cluster.isMaster) {
     for (var i = 0; i < numCPUs; i++) {
        cluster.fork();
    }
} 
else {
    sub.subscribe("userstreams");
    io.sockets.on('connection', function(socket) {
    // Realtime streams : subscribe to redis channel userstreams
        sub.on("message", function(channel, member_postid) {
            console.info("-----------realtime post receieved --------",member_postid);                
        });        
    });
}

publisher.js

// head
var redis      = require("socket.io/node_modules/redis");
var pub        = redis.createClient();
// inside a function 
pst = member + "::" + data.pid
pub.publish("userstreams", pst);

クライアントは postID を 1 回だけ発行しますが、サーバーの userstreams チャネルで複数のサブスクリプションを取得しています。

サーバーが redis サブスクリプションを一度だけ取得して、ユーザーのストリームにソケットで一度だけ送信できるようにします。

4

1 に答える 1

0

socket.io の pub、sub、および client を構成する必要があります。

var pub = redis.createClient();
var sub = redis.createClient();
var client = redis.createClient();

それらをsocket.ioに渡します

io.set('store', new io.RedisStore({
  redisSub : sub,
  redisPub: pub,
  redisClient: client
}));
于 2014-04-26T10:23:06.083 に答える