我有一个 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/