整整一大章全部讲的应答模式的进阶,应该很重要吧(简直是一定的)。
上一节讲到了发布/订阅模式 关于封装的话题,在应答模式中也是如此,不过这个动作已经被底层(zeromq)接管,对应用透明。而其中普通模式与X模式又有区别,例如:req连接Xrep:
[img]http://github.com/imatix/zguide/raw/master/images/fig29.png[/img]
说明:
第三部分是实际发送的数据
第二部分是REQ向XREP发送请求时底层附加的
第一部分是XREP自身地址
注意:
前文已经说过,XREP其实用以平衡负载,所以这里由它对请求数据做了封装操作,如果通过多个XREP,数据结构就会变成这个样子:[img]http://github.com/imatix/zguide/raw/master/images/fig30.png[/img]
同时,如果没有启用命名机制,XREP会自动赋予临时名字:
[img]http://github.com/imatix/zguide/raw/master/images/fig31.png[/img]
不然,就是这样了:
[img]http://github.com/imatix/zguide/raw/master/images/fig32.png[/img]
这里给出一个验证代码:
上面的代码用到的zhelpers:
(未完待续)
上一节讲到了发布/订阅模式 关于封装的话题,在应答模式中也是如此,不过这个动作已经被底层(zeromq)接管,对应用透明。而其中普通模式与X模式又有区别,例如:req连接Xrep:
[img]http://github.com/imatix/zguide/raw/master/images/fig29.png[/img]
说明:
第三部分是实际发送的数据
第二部分是REQ向XREP发送请求时底层附加的
第一部分是XREP自身地址
注意:
前文已经说过,XREP其实用以平衡负载,所以这里由它对请求数据做了封装操作,如果通过多个XREP,数据结构就会变成这个样子:[img]http://github.com/imatix/zguide/raw/master/images/fig30.png[/img]
同时,如果没有启用命名机制,XREP会自动赋予临时名字:
[img]http://github.com/imatix/zguide/raw/master/images/fig31.png[/img]
不然,就是这样了:
[img]http://github.com/imatix/zguide/raw/master/images/fig32.png[/img]
这里给出一个验证代码:
import zmq
import zhelpers
context = zmq.Context()
sink = context.socket(zmq.XREP)
sink.bind("inproc://example")
# First allow 0MQ to set the identity
anonymous = context.socket(zmq.XREQ)
anonymous.connect("inproc://example")
anonymous.send("XREP uses a generated UUID")
zhelpers.dump(sink)
# Then set the identity ourself
identified = context.socket(zmq.XREQ)
identified.setsockopt(zmq.IDENTITY, "Hello")
identified.connect("inproc://example")
identified.send("XREP socket uses REQ's socket identity")
zhelpers.dump(sink)
上面的代码用到的zhelpers:
from random import randint
import zmq
# Receives all message parts from socket, prints neatly
def dump(zsocket):
print "----------------------------------------"
for part in zsocket.recv_multipart():
print "[%03d]" % len(part),
if all(31 < ord(c) < 128 for c in part):
print part
else:
print "".join("%x" % ord(c) for c in part)
# Set simple random printable identity on socket
def set_id(zsocket):
identity = "%04x-%04x" % (randint(0, 0x10000), randint(0, 0x10000))
zsocket.setsockopt(zmq.IDENTITY, identity)
(未完待续)