node.js - Redis pub/sub - 同一进程监听一个 channel

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

最佳答案

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

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

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

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);
});

关于node.js - Redis pub/sub - 同一进程监听一个 channel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30946799/

相关文章:

如果通过 snap 安装,则 Redis 启动服务器

node.js - nginx client_max_body_size 工作不正常

javascript - NodeJS GZip 压缩 - 有问题吗?

javascript - 如何在 node.js 中获取字符串的 sha1 哈希?

node.js - NPM 找不到模块 bash

javascript - Express.js 中 res.send 和 res.json 的区别

html - Express + AngularJS + HTML : ng-include not working (404 - Page not found error)

node.js - ExpressJS 的 Razor View 引擎

redis - 错误 : invalid token 'verify' after the command "rladmin help verify "

node.js - 使用 Redis 模式订阅