Redis pub / sub - 同一个进程收听一个频道

时间:2015-06-19 20:31:25

标签: node.js express redis

我有一个Node.js服务器 - 我希望该进程能够监听自己发送的消息 - 这仅用于测试。我遇到的问题是,当向同一进程发布消息时,订阅者似乎根本不接收它。

我有这个设置:

var redis = require('redis');

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

var message = String('testing123');

rcSub.subscribe('redis_channel@test_overall_health');

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

    console.log(channel,msgs);

});


rcPub.publish('redis_channel@test_overall_health', message);

我有一个redis客户端充当订阅者,一个充当发布者,这是您必须这样做的方式,但由于某种原因,消息未被接收。流程是否存在一些限制,无法收听它发布的消息?它似乎没有意义。我可以验证这段代码或多或少是正确的,因为收听同一频道的其他进程收到了消息。

1 个答案:

答案 0 :(得分:3)

显然,在SUBSCRIBE命令之后发送PUBLISH命令。

Node的Redis客户端将命令排队,直到与Redis服务器建立连接,并在套接字上收到connect事件时将排队的命令刷新到服务器。首先发起连接的客户端(发布者)很可能首先接收connect事件,此时它将发送其排队的命令(发布)。由于Redis在单个线程中处理命令,因此仅在SUBSCRIBE命令完成后才对订户PUBLISH进行处理。其他进程能够接收消息,因为他们已经订阅了此频道。

首先创建订阅者客户端应该在大多数情况下都有效,尽管更安全的方法是在发布任何消息之前等待订阅完成:

var redis = require('redis');

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

subscriber.subscribe('redis_channel@test_overall_health');

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

subscriber.on('subscribe', function (channel, count) {
    publisher.publish('redis_channel@test_overall_health', message);
});