You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js父子进程间Redis Pub/Sub实现异常排查

Node.js父子进程Redis Pub/Sub:子进程无报错但收不到消息

问题场景

使用node-redis 4.6.7 + Redis 6.2.12实现父子进程间的Pub/Sub:

  • 封装了Redis连接模块,返回Promise包装的已连接客户端
  • 子进程通过duplicate()创建订阅客户端,订阅指定频道后向父进程发送确认信号
  • 父进程收到确认后发布消息,但子进程收不到任何消息;Redis Profiler仅能捕获PUBLISH命令,看不到SUBSCRIBE命令

核心原因分析

Redis Profiler看不到SUBSCRIBE命令,说明子进程根本没有向Redis服务器发送订阅请求,大概率是子进程的Redis连接或订阅逻辑存在隐藏错误(无报错是因为未添加错误捕获),或者node-redis v4的API使用方式不正确。

排查与修复步骤

1. 给子进程添加完整的错误捕获

子进程的连接、订阅操作未处理异常,即使失败也不会抛出错误,导致问题隐藏。修改子进程代码:

// 假设c是从Connection模块获取的已连接客户端Promise
c.then(async (client) => {
  const sub = client.duplicate();
  try {
    await sub.connect();
    console.log('子进程订阅客户端连接成功');

    // 正确订阅事件(node-redis v4推荐用message事件监听)
    sub.on('message', (channel, message) => {
      console.log(`收到频道 ${channel} 的消息: ${message}`);
      // 你的业务处理代码
    });

    await sub.subscribe('PuppeteerScraper::IN');
    console.log('已成功订阅频道 PuppeteerScraper::IN');

    // 向父进程发送确认(确保无多余换行/空格)
    process.stdout.write('PuppeteerScraperWorker::Subscribed');
  } catch (err) {
    console.error('子进程Redis操作失败:', err);
  }
}).catch(err => console.error('获取Redis客户端失败:', err));

2. 修正Connection模块的Promise封装

手动包装Promise存在潜在问题,直接使用connect()返回的Promise即可:

// 替换原promisedClient的创建逻辑
this.promisedClient = this.client.connect().then(() => {
  console.log('Redis客户端已连接');
  return this.client;
}).catch(err => {
  console.error('Redis连接失败:', err);
  throw err;
});

3. 验证父子进程的Redis配置一致性

确保父子进程使用相同的Redis URL(dev/prod环境一致),避免连接到不同的Redis实例导致订阅/发布不互通。

4. 修正父进程的确认信号判断

子进程的stdout输出可能包含换行符或空格,导致判断不成立,添加trim()处理:

proc.stdout.on('data', data => {
  const decodedData = data.toString('utf8').trim();
  if (decodedData === 'PuppeteerScraperWorker::Subscribed') {
    client.then(c => {
      c.publish('PuppeteerScraper::IN', JSON.stringify(source));
      console.log('已向频道发送消息');
    }).catch(err => console.error('父进程发布消息失败:', err));
  }
});

5. 确认node-redis v4的订阅API使用正确

node-redis v4中,subscribe方法的回调参数顺序是(message, channel),更推荐通过message事件监听消息(代码如步骤1所示),避免因参数顺序错误导致逻辑无响应。

内容的提问来源于stack exchange,提问作者violetflare

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 10:52:31