【问题标题】:Redis pub/sub - same process listening to one channelRedis pub/sub - 同一个进程监听一个频道
【发布时间】:2015-06-21 13:58:20
【问题描述】:

我有一个 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 客户端,这是您必须这样做的方式,但由于某种原因没有收到消息。进程不能监听它发布的消息是否存在一些限制?这似乎没有意义。我可以验证此代码或多或少是正确的,因为侦听同一频道的其他进程收到了该消息。

【问题讨论】:

    标签: node.js express redis


    【解决方案1】:

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

    Node 的 Redis 客户端将命令排队,直到与 Redis 服务器建立连接,并在套接字上收到 connect 事件时将排队的命令刷新到服务器。首先启动连接的客户端(发布者)很可能首先收到connect 事件,此时它将发送其排队的命令(发布)。因为 Redis 在单线程中处理命令,所以订阅者 SUBSCRIBEs 只有在 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);
    });
    

    【讨论】:

    • 太棒了,谢谢,我周一上班时试试这个:)
    • 试过了,你说的似乎是正确的,感谢您解决这个问题。我为自己创建的这个问题存在于各种 pub/sub 库中,并且清楚地表明我在这里是新手 :) 这是一个问题,因为异步库始终具有欺骗性。 IMO,subscriber.subscribe 应该强制你包含一个回调,这将消除欺骗。如果你需要一个单独的回调“sub.on('subscribe')”,那么你可以自己实现一个 eventsEmitter,这会更好 IMO。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-18
    • 2013-03-20
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    • 2021-09-16
    • 1970-01-01
    相关资源
    最近更新 更多