【问题标题】:What ZeroMQ socket type to use for inter process communication?用于进程间通信的 ZeroMQ 套接字类型是什么?
【发布时间】:2014-07-30 02:18:20
【问题描述】:

当我有两个线程时,我使用了 PAIR 套接字类型。但是现在我正在使用两个进程,它们可以在一台机器上,也可以在不同的机器上。我不需要请求和响应,我不需要发送到多个节点等。我需要与 PAIR(异步、双向)相同的东西,但需要进程和网络。我应该使用哪些套接字类型?

【问题讨论】:

    标签: c ipc zeromq


    【解决方案1】:

    不幸的是,你的世界变得有点复杂了。在更广泛的分布式系统中,没有与PAIR/PAIR 套接字配对的直接模拟。

    也就是说,如果您保持大致相同的拓扑形状(两个节点彼此专门连接,没有其他节点),那么您几乎可以使用 ROUTER/DEALER 甚至 DEALER/DEALER 来实现您想要的(当您在 cmets 中建议)。这些套接字有点像REQ/REP,但它们不强制执行严格的请求/响应通信模式,它们完全不受限制,所以实际上你得到了同样的东西。如果您打算添加更多节点,则唯一的问题是,此时您必须开始以不同的方式管理事物,特别是 DEALER 套接字不允许您选择发送到哪个节点,它是严格的循环法。

    但是,这样做应该会得到你想要的东西(异步、双向)。

    ROUTER 套接字类型可能需要一点额外的复杂性,因为您需要跟踪另一个节点的“标识符”才能发送回它(您可以几乎 免费,特别是在您只有一个对等方的情况下,直接从发送的消息中使用它)。因为这是一个独家对,你可以忽略DEALER套接字引入的循环不确定性,直接去DEALER/DEALER,它给你一个不受限制的消息模式,不需要任何身份管理。

    【讨论】:

    • 我可以使用 DEALER/DEALER。谢谢。
    • 我没有考虑过这种配对,但在独家配对中它会很好用,并且可能是最低复杂性的最佳选择。我会相应地编辑我的答案。
    【解决方案2】:

    @Marko 让我注意到,

    在 ZMQ.SOCKET 的(正式通信模式)“类型” 与任何传输方式之间存在主要分离,可以选择.bind() / @ 987654323@结束

    一旦您的架构很高兴(如您所写)可以使用 PAIR/PAIR“会话”

    您可以在没有一个额外的 SLOC 的情况下更改要使用的传输方式

    有效

    Python 2.7.3 ...
    >>> import zmq
    >>> zmq.zmq_version()
    '2.1.11'
    >>> aZmqCONTEXT =  zmq.Context()                       # --<BoCTX>-- [SideA] Node
    >>> aZmqSOCKET  = aZmqCONTEXT.socket( zmq.PAIR )       # here one decides about a type
    >>> aZmqSOCKET.bind( "tcp://192.168.0.62:2027" )       # here is the transport // used to be ( "ipc://...")
    >>> aZmqSOCKET.recv()                                  # here the PAIR waits for 1st MSG
    'aMSG from the opposite PAIR/PAIR zmq-session Node arrived via TCP-transport ... QED'
    >>> aZmqSOCKET.setsockopt( zmq.LINGER, 0 )             # pre-termination tidy-up
    >>> aZmqSOCKET.close()
    >>> aZmqCONTEXT.term()                                 # --<EoCTX>-- safe to clean-exit
    >>> 
    

    【讨论】:

    • ZeroMQ 文档中明确指出,PAIR 仅适用于 inproc。我不知道为什么它对你的情况有效。 dropbox.com/s/he8rkzds98am4p1/…
    • @MarkoKevac 感谢您的反馈——尽管如此,文本确实说:“......设计为...... ://inproc”(因为 PAIR/PAIR 抽象模式产生了它最好的无堆栈的进程间通信字段,),但它没有说任何关于不能,也没有被禁止,.bind() / .connect() 超过任何其他支持的传输类。当然,将 [usec]-s 用于提供 TCP/IP 堆栈以将缓冲的字节块传递给另一个 <_localhost_> 进程是可能的,但是它既浪费时间又浪费资源,因此://inproc 在这里最好。
    • 作为一个更一般的说明,这种体验使其更加明显,富含抽象的正式通信模式的概念是ZeroMQ / nanomsg“背后”最令人兴奋和最强大的“黑暗质量”惊喜并不总是被看到、理解和利用来实现这些伟大工具的最佳使用。值得一读这本书,只拍下无花果中的想法。并且只有在那之后才开始设计草图并在最后对源代码进行编码。 与传输无关、容错的并行负载平衡根本无法从单独的源代码行中理解。
    猜你喜欢
    • 1970-01-01
    • 2011-12-01
    • 1970-01-01
    • 2016-07-16
    • 2011-07-28
    • 1970-01-01
    • 1970-01-01
    • 2014-12-09
    • 1970-01-01
    相关资源
    最近更新 更多