【发布时间】:2014-07-30 02:18:20
【问题描述】:
当我有两个线程时,我使用了 PAIR 套接字类型。但是现在我正在使用两个进程,它们可以在一台机器上,也可以在不同的机器上。我不需要请求和响应,我不需要发送到多个节点等。我需要与 PAIR(异步、双向)相同的东西,但需要进程和网络。我应该使用哪些套接字类型?
【问题讨论】:
当我有两个线程时,我使用了 PAIR 套接字类型。但是现在我正在使用两个进程,它们可以在一台机器上,也可以在不同的机器上。我不需要请求和响应,我不需要发送到多个节点等。我需要与 PAIR(异步、双向)相同的东西,但需要进程和网络。我应该使用哪些套接字类型?
【问题讨论】:
不幸的是,你的世界变得有点复杂了。在更广泛的分布式系统中,没有与PAIR/PAIR 套接字配对的直接模拟。
也就是说,如果您保持大致相同的拓扑形状(两个节点彼此专门连接,没有其他节点),那么您几乎可以使用 ROUTER/DEALER 甚至 DEALER/DEALER 来实现您想要的(当您在 cmets 中建议)。这些套接字有点像REQ/REP,但它们不强制执行严格的请求/响应通信模式,它们完全不受限制,所以实际上你得到了同样的东西。如果您打算添加更多节点,则唯一的问题是,此时您必须开始以不同的方式管理事物,特别是 DEALER 套接字不允许您选择发送到哪个节点,它是严格的循环法。
但是,这样做应该会得到你想要的东西(异步、双向)。
ROUTER 套接字类型可能需要一点额外的复杂性,因为您需要跟踪另一个节点的“标识符”才能发送回它(您可以几乎 免费,特别是在您只有一个对等方的情况下,直接从发送的消息中使用它)。因为这是一个独家对,你可以忽略DEALER套接字引入的循环不确定性,直接去DEALER/DEALER,它给你一个不受限制的消息模式,不需要任何身份管理。
【讨论】:
@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
>>>
【讨论】:
.bind() / .connect() 超过任何其他支持的传输类。当然,将 [usec]-s 用于提供 TCP/IP 堆栈以将缓冲的字节块传递给另一个 <_localhost_> 进程是可能的,但是它既浪费时间又浪费资源,因此://inproc 在这里最好。