2015-06-19 99 views
1

我有一個Node.js服務器 - 我希望該進程能夠監聽自身發送的消息 - 這僅用於測試。我遇到的問題是,當向相同的流程發佈消息時,用戶似乎根本沒有收到它。Redis發佈/訂閱 - 同一個進程監聽一個頻道

我有這樣的設置:

var redis = require('redis'); 

var rcPub = redis.createClient(); 
var rcSub = redis.createClient(); 

var message = String('testing123'); 

rcSub.subscribe('[email protected]_overall_health'); 

rcSub.on('message', function (channel, msgs) { 

    console.log(channel,msgs); 

}); 


rcPub.publish('[email protected]_overall_health', message); 

我有一個客戶端的Redis充當一個用戶,一個作爲出版人,這是你必須做的方式,但由於某些原因的消息是不正在收到。是否有一個限制,即進程無法收聽它發佈的消息?這似乎沒有道理。我可以驗證這個代碼或多或少是正確的,因爲偵聽同一個通道的其他進程收到了這個消息。

回答

2

很顯然,在PUBLISH命令後發送了SUBSCRIBE命令。

節點的Redis客戶端隊列命令,直到建立到Redis服務器的連接並在套接字上收到一個connect事件時,將排隊的命令刷新到服務器。首先啓動連接的客戶端(發佈者)很可能會首先收到connect事件,此時它將發送其排隊的命令(發佈)。由於Redis在單個線程中處理命令,因此只有在命令PUBLISH完成後,訂戶SUBSCRIBE纔會生效。其他進程能夠接收消息,因爲他們已經訂閱了此頻道。

首先創建用戶客戶端應該在大多數情況下,雖然是一個比較保險的做法將是等待訂閱發佈的任何消息之前完成:

var redis = require('redis'); 

var publisher = redis.createClient(), 
    subscriber = redis.createClient(), 
    message = 'testing123'; 

subscriber.subscribe('[email protected]_overall_health'); 

subscriber.on('message', function (channel, message) { 
    console.log(channel, message); 
}); 

subscriber.on('subscribe', function (channel, count) { 
    publisher.publish('[email protected]_overall_health', message); 
}); 
+0

冷靜,感謝,會在我嘗試了這一點在星期一工作:) –

+0

試過了,你說什麼看起來是正確的,謝謝你解決這個問題。我爲自己創建的這個問題存在於各種pub/sub庫中,並清楚地表明我是新手:)這是一個問題,因爲異步庫一直具有欺騙性。國際海事組織,subscriber.subscribe應該強制你包括一個回調,這將消除欺騙。如果你需要一個單獨的回調「sub.on('subscribe')」,那麼你可以自己實現一個eventsEmitter,那會更好的IMO。 –