2015-06-19 58 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。 –