Redis发布/订阅-收听一个频道的相同过程

Ale*_*lls 2 redis node.js express

我有一台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);
Run Code Online (Sandbox Code Playgroud)

我有一个Redis客户端,充当订阅者,一个作为发布者,这是您必须这样做的方式,但是由于某些原因,没有收到消息。进程不能听其发布的消息是否有某些限制?这似乎没有道理。我可以验证此代码或多或少正确,因为侦听同一频道的其他进程收到了该消息。

c.P*_*.u1 5

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

节点的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);
});
Run Code Online (Sandbox Code Playgroud)