我有一个分配N个子进程的Node.js进程(不是服务器).
在某些时候,可能会有超过50个CP.所以我开始认为如果process.send(IPC)真正阻塞,那么这可能是每个CP经历的重大惩罚.因为我的程序中发生的事情是每个CP使用process.send将消息发送到单个父进程,以便父进程进行日志记录,以便同步日志记录.但是如果process.send阻塞,那么父进程可能会成为瓶颈.
在某些时候,可能会有超过50个CP.所以我开始认为如果process.send(IPC)真正阻塞,那么这可能是每个CP经历的重大惩罚.因为我的程序中发生的事情是每个CP使用process.send将消息发送到单个父进程,以便父进程进行日志记录,以便同步日志记录.但是如果process.send阻塞,那么父进程可能会成为瓶颈.
所以问题是 – 在nix和Windows上Node.js是IPC阻塞还是非阻塞?如果它是阻塞的,如果我或其他人真的想要异步IPC,我应该使用消息队列还是ZeroMQ?
解决方法
进程发送已设置为异步,请参阅
https://github.com/nodejs/node/commit/56d9584a0ead78874ca9d4de2e55b41c4056e502
"`ChildProcess.prototype.send()` and `process.send()` used to operate synchronously but became asynchronous in commit libuv/libuv@393c1c5"
这是由于libuv代码的变化;它有一些缺点,但如果你担心父进程成为瓶颈,你可以改为使用管道进行通信.
50个CP不会出现问题,但可能会有500个,具体取决于您的体系结构和消息大小.那时我会推荐一个更有趣的消息队列. ZeroMQ或普通redis应该可以工作.