ZeroMQ 和 IPC 的区别
Difference between ZeroMQ and IPC
Q1:什么 与解释的默认进程间通信相比,使用 ZeroMQ
向子进程发送消息的确切区别 here ?
Q2:直接进程到子通信,哪个更合适? (更快)
Q3:文档说:Creates an IPC channel
,什么它使用的是什么IPC
? TCP
?套接字?
使用像 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 的情况下,消息必须适合内存)。
Q1:什么 与解释的默认进程间通信相比,使用 ZeroMQ
向子进程发送消息的确切区别 here ?
Q2:直接进程到子通信,哪个更合适? (更快)
Q3:文档说:Creates an IPC channel
,什么它使用的是什么IPC
? TCP
?套接字?
使用像 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 的情况下,消息必须适合内存)。