Node.js 进程间通信(IPC)方式总结

1. child_process 内置 IPC 通道

使用 fork() 创建子进程时,父子进程之间会建立一条专用 IPC 通道,通过 process.send() / process.on('message') 收发消息,传输的是 JSON 序列化数据。

javascript 复制代码
// parent.js
const { fork } = require('child_process');
const child = fork('child.js');
child.send({ hello: 'world' });
child.on('message', msg => console.log('from child:', msg));

// child.js
process.on('message', msg => {
  console.log('from parent:', msg);
  process.send({ received: true });
});

适用场景:父子进程一对一通信,简单任务分发。


2. 管道(pipe / stdio)

通过标准输入输出流(stdin/stdout/stderr)传递数据,适合流式处理。

lua 复制代码
const { spawn } = require('child_process');
const child = spawn('grep', ['hello']);
child.stdout.on('data', data => console.log(data.toString()));
child.stdin.write('hello world\n');
child.stdin.end();

适用场景:与外部程序协作、流式数据处理(如 shell pipeline)。


3. 共享内存(SharedArrayBuffer + Worker Threads)

worker_threads 模块支持通过 SharedArrayBuffer 在线程间共享内存,配合 Atomics 实现同步,性能极高。

javascript 复制代码
const { Worker, isMainThread, workerData } = require('worker_threads');
const shared = new SharedArrayBuffer(4);
const arr = new Int32Array(shared);

if (isMainThread) {
  new Worker(__filename, { workerData: shared });
  Atomics.store(arr, 0, 42);
} else {
  console.log(Atomics.load(new Int32Array(workerData), 0)); // 42
}

适用场景:CPU 密集型任务、高频数据共享(注意线程安全)。


4. Unix Domain Socket / Named Pipe

通过本机 socket 文件进行通信,速度接近共享内存,支持双向通信,也适合不同语言的进程互通。

ini 复制代码
// server
const net = require('net');
net.createServer(sock => {
  sock.on('data', d => sock.write('pong: ' + d));
}).listen('/tmp/app.sock');

// client
const client = net.connect('/tmp/app.sock');
client.write('ping');
client.on('data', d => console.log(d.toString()));

适用场景:同机多进程通信、与非 Node 进程互通。


5. TCP / HTTP / WebSocket

走网络协议的通信方式,天然支持跨机器,是微服务架构的基础。

javascript 复制代码
// 用 HTTP 做简单 IPC
const http = require('http');
http.createServer((req, res) => res.end('pong')).listen(3001);

http.get('http://localhost:3001', res => {
  res.on('data', d => console.log(d.toString()));
});

适用场景:分布式系统、微服务、需要跨机通信。


6. 消息队列(Redis / RabbitMQ / Kafka 等)

借助外部消息中间件实现解耦的异步通信,支持发布/订阅、持久化、重试等能力。

javascript 复制代码
// 使用 ioredis 的 Pub/Sub
const Redis = require('ioredis');
const pub = new Redis(), sub = new Redis();
sub.subscribe('channel');
sub.on('message', (ch, msg) => console.log(msg));
pub.publish('channel', 'hello');

适用场景:高并发、解耦、需要消息持久化或跨服务广播。


对比总结

方式 速度 跨机器 复杂度 适用场景
IPC 通道 (fork) 父子进程
管道 (pipe) 流式数据
SharedArrayBuffer 最快 线程间共享
Unix Socket 很快 同机多进程
TCP/HTTP 微服务
消息队列 分布式解耦

选择时优先考虑:是否跨机是否需要解耦对延迟的要求

相关推荐
小林ixn21 分钟前
从 onclick 到 React 合成事件,再到完整应用逻辑:一次前端架构的深度剖析
前端·react.js·前端框架
Csvn1 小时前
🧩「找不到模块」排查全记录——Monorepo 下 TypeScript 路径别名的 5 种「不通」与根治方案
前端
腻害兔1 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:字典、短信、邮件、通知——后台系统的“基础设施四件套“!
java·前端·vue.js·产品经理·ai编程
CodexDave1 小时前
MySQL事务隔离级别与MVCC机制解析
前端·数据库·mysql·nginx·性能优化·负载均衡
Ai_easygo2 小时前
AI Agent开发入门——从ReAct到Tool Calling,拆解Agent的底层运行逻辑
前端·人工智能·react.js
研☆香2 小时前
分析制作html页面,如何划分页面结构
前端
腻害兔3 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:支付模块 yudao-module-pay,一个让产品经理都看懂的支付中台设计
java·前端·vue.js·产品经理·ai编程
kyriewen3 小时前
我扒了最近的前端面经——2026年面试不背八股文了,考这5样
前端·面试·ai编程
IT_陈寒3 小时前
Redis的持久化配置把我坑惨了:你以为数据安全了?
前端·人工智能·后端
小徐_23333 小时前
uni-app 项目别再从零搭了!3 个 Wot UI 起手模板怎么选?
前端·uni-app