簡體   English   中英

Node.js Redis發布/訂閱丟失消息

[英]Node.js redis pub/sub missing message


我正在嘗試從兩天后開始調試此代碼,但無法弄清楚,所以我問您。
代碼非常簡單:兩個端點幾乎可以完成相同的操作。
第一個“ s”偵聽通道“ idS”上的任何消息。 如果10秒鍾后仍未收到任何東西,則結束。 如果req.body不為空,則將其發送到'c'。
在第二個中,“ c”總是向“ idS”發送消息,並在通道“ idC”上等待消息。
在“ s”中,變量“ id”設置為1,因此“ c”可以了解“ s”何時在線。
我有兩個不同的測試程序(每個端點一個)。
在testS中,我不使用req.body調用端點,當我收到答案時,我再次使用req.body調用端點。
在testC中,我只是調用端點並等待答案。 收到該消息后,我會在一秒鍾后再次呼叫該端點。

測試應該以這種方式工作:

  1. s connect,除了在通道“ idS”上監聽之外,沒有其他要發送的內容。
  2. c連接,在通道“ idC”上偵聽,並在“ idS”上發送“測試”。
  3. 在通道“ idS”上收到消息“ test”並退出。
  4. 一個新的S連接,在通道'idS'上偵聽,並在'idC'上向c發送一條消息。
  5. c在頻道“ idC”上接收並退出。
  6. 一秒鍾后再次連接新的c,並從2開始重復。


var express = require('express'),
    redis = require('redis'),
    util = require('util'),
    client = redis.createClient(6379, 'localhost');
var router = express.Router();

router.post('/s', function(req, res){
    var id = req.query.code;
    var cId = "c_" + id;
    var sId= "s_" + id;

    //BUILD RESPONS
    var respons = {....};

    var clientSub = redis.createClient(6379, "localhost");
    clientSub.on("message", function(channel, msg){
        if(timeoutId)
            clearTimeout(timeoutId);
        client.del(id);
        respons.val = idS;
        clientSub.unsubscribe(idS);
        clientSub.quit();
        res.send(respons).end();
    });
    clientSub.subscribe(idS);
    client.set(id, 1);

    if(req.body){
        client.publish(idC, JSON.stringify(req.body));
    }

    var timeoutId = setTimeout(function(){
        if(!res.headersSent){
            clientSub.unsubscribe(idS);
            clientSub.quit();
            client.del(id);
            console.log(" HUB TIMEOUTED " + id);

            res.json(respons).end();
        }
    },1000*10);
});

router.post('/c', function(req, res){    
    var id = //code to get id
    var idC = "c_" + id;
    var idS= "s_" + id;


    var clientSub = redis.createClient(6379, "localhost");
    clientSub.once("message", function(channel, msg){
        var respons = {};
        respons.data = msg;
        clientSub.unsubscribe(idC);
        clientSub.quit();
        res.json(respons).end();
    });
    //subscribe to a channel
    clientSub.subscribe(idC);


    //try to send message
    client.get(id, function(err, reply){
        if(err)
            console.log(err);
        else if(reply == 1){
            client.publish(idS, "test");
        } else{
            console.log("ERROR!!!");
        }

    });
});

顯然,問題是'c'有時沒有在'idC'上收到消息(或者s沒有發送它??)。
該錯誤不在測試程序中。

謝謝你的幫助!

用then-redis解決。 問題是同步的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM