ZeroMQ 和 IPC 的区别

Difference between ZeroMQ and IPC

Q1:什么 与解释的默认进程间通信相比,使用 ZeroMQ 向子进程发送消息的确切区别 here

Q2:直接进程到子通信,哪个更合适? (更快)

Q3:文档说:Creates an IPC channel什么它使用的是什么IPCTCP?套接字?

使用像 ZeroMQ 这样的消息队列让您能够横向扩展到多台机器,而子进程通信只是本地的,只能横向扩展以利用该机器上的硬件。

拥有消息代理会变慢,因为它依赖于 TCP,而子进程通信使用管道或标准 I/O。哪个更快,因为它避免了 TCP 和网络堆栈的开销。虽然我会说这里的速度优势可以忽略不计,特别是如果你计划扩展到多台机器。

同样值得注意的是,ZeroMQ 可以使用 unix_sockets,并提供其他形式的 IPC,这与 child_process 核心模块提供的非常相似。虽然它可能更难使用。

也许在需要跨多台机器进行横向扩展之前,将 ZeroMQ 与 unix_sockets 或管道一起使用并不是一个坏主意。


在最开始的时刻要说明的一个好点 - ZeroMQ无经纪人


A1:使用ZeroMQ发送消息和IPC

的区别

好吧,这么说吧,ZeroMQ 专注于很多不同的好处,而不仅仅是发送消息和扩大规模的能力(两者都很有帮助).

ZeroMQ 介绍 (可扩展性好) 正式沟通模式

这就是说,应用程序端的核心焦点是可以使用哪些 ZeroMQ 库模式原语来直接实现参与代理之间的实际需要的行为模型(一个 PUB +多SUB-s/多PUB-s+多交叉SUB-s )

如何编写更复杂的、特定于应用程序的信令平面(使用可用的 ZeroMQ 构建块行为原始套接字原型 + 设备 + 应用程序逻辑,为添加的信令平面提供有限状态机或事务引擎功能 ).

标准 IPC 提供哑巴 O/S-based 服务,无行为

这很好,如果在纯 O/S-context 中理解(即“包含电池”是 不是这种情况)。

然而,任何更高级别的消息传递支持和其他重要功能 (类似公平队列、循环调度、any/all { inproc:// | ipc:// | tcp:// | pqm:// | ... } 传输-classes 上的 mux-ed 传输不可知服务组合、毫秒调整的多通道轮询器、零复制消息传递和许多其他智能功能)要自己设计/实现(就是这样,为什么ZeroMQ被放在游戏中,而不是必须这样做,不是吗?非常感谢 Martin SUSTRIK 和 Pieter HINTJENS 的团队 )


最好的下一步是什么?

To see a bigger picture on this subject >>> 更多参数,一个简单的信号平面图片和一个直接link 到 Pieter HINTJENS 的必读书籍


A2:更快? 如果有人给出一个简单的答案,我会担心。这取决于...很多...

如果对 ZeroMQ 的妹妹 nanomsg 感兴趣,请查看 Martin SUSTRIK nanomsg.org >>> 的更轻量级框架。

快,更快,最快...

关于最小开销的灵感(读作速度的高潜力) 零拷贝(读作有效的避免开销)阅读有关 inproc:// 传输 classes 的线程间消息传递:


A3: 使用IPC.

IPC 本身就是一个传输-class。没有必要 re-wrap/align/assemble/CRC/encapsulate/dispatch|decode\CRC-recheck\demap... 原始 IPC-数据到更高的抽象 TCP-数据包,如果在 localhost 进程之间传输通过 IPC 频道,是吗?

在您链接的情况下,我们正在谈论两个相互竞争的协议。一个是通用的 (ZMQ),另一个绑定到 NodeJS。引用您链接到的关于 IPC 的文章“不支持以 process.send() 以外的任何方式访问 IPC 通道 fd 或将 IPC 通道与不是 Node.js 实例的子进程一起使用."

一般来说,IPC(进程间通信)可以指代许多不同的协议,包括ZMQ。 ZMQ是一种IPC机制。还有其他较低级别的机制,例如 PIPE 和 UDP 套接字。我同时使用过 PIPE 和 UDP 套接字,发现更高级别的协议(例如 ZMQ)几乎总是更好,即使在简单的双方案例中也是如此,因为 PIPE 和 UDP 存在两个问题:

缓冲分块

Buffering:操作系统不断创建缓冲区来存储在进程之间发送的消息部分。这些缓冲区必须 刷新 。您最终不得不编写一堆难以正确处理的繁琐代码,以刷新消息,并读取和拼接部分发送的消息。

分块:UDP 的最大消息大小在 500 到 65000 字节之间可变。直接使用 UDP 时,您必须处理这些最大大小并将消息分块。 ZMQ 自动处理分块,您不必 fiddle 处理它。 ZMQ 中没有最大消息大小(好吧,在 ZMQ 的情况下,消息必须适合内存)。