【问题标题】:Difference between ZeroMQ and IPCZeroMQ 和 IPC 的区别
【发布时间】:2015-12-17 08:43:02
【问题描述】:

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

Q2:对于直接与孩子沟通的过程,哪个更合适? (更快

Q3:文档说:Creates an IPC channelwhat 那种IPC 使用? TCP?套接字?

【问题讨论】:

  • 这是一个讨论问题,因此不适合 StackOverflow。你试过chat吗?

标签: node.js ipc zeromq inproc nanomsg


【解决方案1】:

使用 ZeroMQ 之类的消息队列使您能够横向扩展至多台机器,而子进程通信仅在本地进行,只能横向扩展以利用该机器上的硬件。

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

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

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

【讨论】:

    【解决方案2】:

    在最开始的时候说明一个好点 - ZeroMQ 没有经纪人


    A1:使用ZeroMQ发送消息和IPC的区别

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

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

    这就是说,核心应用程序端的重点是针对哪些 ZeroMQ 库模式原语可用于直接满足参与代理之间实际需要的行为模型(一个 PUB + 许多SUB-s / many PUB-s + many cross-connected SUB-s )

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

    标准 IPC 提供基于 O/S 的愚蠢服务,没有行为

    这很好,如果在纯操作系统上下文中理解(即“包含电池不是这种情况)。

    不过,任何更高级别的消息传递支持和其他强大功能 (如公平队列、循环调度、任何/所有{ inproc:// | ipc:// | tcp:// | pqm:// | ... } 传输类上的多路复用传输无关服务组合、毫秒调整的多通道轮询器、零拷贝消息切换和许多其他智能功能)是自己设计/实现(正是这种情况,为什么将 ZeroMQ 放入游戏中,而不是必须这样做,不是吗?非常感谢,Martin SUSTRIK 和 Pieter HINTJENS'团队


    最好的下一步?

    To see a bigger picture on this subject >>> 带有更多参数、简单的信号平面图片指向 Pieter HINTJENS 必读书籍的直接链接 .


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

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

    快、快、快...

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


    A3:它使用IPC

    IPC 本身就是一个传输类。没有必要重新包装/对齐/组装/CRC/encapsulate/dispatch|decode\CRC-recheck\demap... 原始IPC-data 到更高的抽象TCP-packets 如果在之间正确传输localhost 通过 IPC 通道处理,是吗?

    【讨论】:

    • 对于 Q3:我相信它在 Linux 上使用 unix socket,在 windows 上使用 TCP。但是 IPC 本身并不是一种传输方式,例如可以使用共享内存来实现 IPC 传输(会更快但更难实现)。
    • 不一定:赢 ipc:// 根本不需要 TCP-overhead 并且可能在 nanomsg 中通过命名管道 > >> nanomsg.org/v0.1/nn_ipc.7.html
    【解决方案3】:

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

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

    缓冲分块

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-25
      • 2011-12-25
      • 2011-01-10
      • 2012-06-10
      • 2012-01-19
      • 2020-05-07
      • 2013-07-22
      相关资源
      最近更新 更多