我正在尝试在 Node.JS 中的父进程和子进程之间实现 Pub/Sub。
我使用的是node-redis版本4.6.7和redis服务器版本6.2.12。
我已经构建了一个具有自己的模块的连接对象。它处理与 Redis 的连接,然后返回包装在 Promise 中的连接客户端。
if (isDev) {
this.client = createClient({ url: config.REDIS_URL_DEV });
} else {
this.client = createClient({ url: config.REDIS_URL_PROD });
}
this.promisedClient = new Promise((resolve) => {
this.client.connect().then(() => {
resolve(this.client);
});
});
我在父进程和子进程中都需要该模块。
在子进程内,我订阅父进程发送消息的通道:
const sub = c.duplicate();
sub.connect().then(() => {
sub.subscribe('PuppeteerScraper::IN', (source) => { ... here goes my handler code ... })
})
在父进程中,在确定子进程已订阅后,我发布一条消息:
proc.stdout.on('data', data => {
const decodedData = data.toString('utf8');
if (decodedData === 'PuppeteerScraperWorker::Subscribed') {
client.then(c => {
c.publish('PuppeteerScraper::IN', JSON.stringify(source));
})
}
})
问题是,子订阅时没有错误,父发布时没有错误。最后子进程收不到数据。
当我打开探查器时,我看到发布命令,但看不到订阅命令。
04:59:29.246 [0 192.168.1.209:24164] "PUBLISH" "PuppeteerScraper::IN" "{"scraper":"Puppeteer","url":"<redacted>"}"
基本上,来自子进程的订阅命令不会显示在分析器中。
解决了。结果我没有告诉子进程连接到 dev,所以父进程正在与 DEV 通信,而子进程正在与 PROD 通信。