zeroMQ初体验-16.应答模式进阶(二)-定制路由1

在上一节中已经提到XREP主要工作是包装数据,打上标记以便方便的传递数据。那么,换个角度来看,这不就是路由么!其实在[url=http://iyuan.iteye.com/blog/975612]优雅的扩展[/url]中有介绍过。在这里针对XREP模式做深入的探索。

首先,得要理一下其中几种类型的差别(相似的名字真是坑爹啊):
REQ,官网称之为"老妈类型",因为它负责主动提出请求,并且要求得到答复(严格同步的)
REP,"老爸类型",负责应答请求,(从不主动,也是严格同步的)
XREQ,"分销类型",负责对进出的数据排序,均匀的分发给接入的REP或者XREP
XREP,"路由类型",将信息转发至任何与他有连接的地方,可以和任何类型相连,不过看起来,天然的和老妈比较亲密。

传统的看法是,应答模式自然得同步的。不过在这里,显然是可以做到异步的(只要"老爸"或者"老妈"不处在整个线路的中间位置).

通常定制路由会用到以下四种通迅连接:
XREP-to-XREQ.
XREP-to-REQ.
XREP-to-REP.
XREP-to-XREP.

在这几种基本连接下,定制路由完全看各人的想象力了。不过在即将到来的各种通讯的详解前,还是得要申明一下:
自定义路由有风险,使用需谨慎啊!

首先要介绍的是XREP-XREQ模式:
这是比较简单的一种模式,XREQ会用到三种情景:1,汇总,2,代理分发,3,响应答复。
这里要注意,如果XREQ用于响应答复,最好只有一个XREP与它相连,因为XREQ不会指定发送目标,而会将数据均衡的摊派给所有与它有连接关系的XREP.

这里给出一个汇总式的例子:
[img]http://github.com/imatix/zguide/raw/master/images/fig33.png[/img]

import time
import random
from threading import Thread
import zmq

def worker_a(context):
    worker = context.socket(zmq.XREQ)
    worker.setsockopt(zmq.IDENTITY, 'A')
    worker.connect("ipc://routing.ipc")

    total = 0
    while True:
        request = worker.recv()
        finished = request == "END"
        if finished:
            print "A received:", total
            break
        total += 1

def worker_b(context):
    worker = context.socket(zmq.XREQ)
    worker.setsockopt(zmq.IDENTITY, 'B')
    worker.connect("ipc://routing.ipc")

    total = 0
    while True:
        request = worker.recv()
        finished = request == "END"
        if finished:
            print "B received:", total
            break
        total += 1

context = zmq.Context()
client = context.socket(zmq.XREP)
client.bind("ipc://routing.ipc")

Thread(target=worker_a, args=(context,)).start()
Thread(target=worker_b, args=(context,)).start()

time.sleep(1)

for _ in xrange(10):
    if random.randint(0, 2) > 0:
        client.send("A", zmq.SNDMORE)
    else:
        client.send("B", zmq.SNDMORE)

    client.send("This is the workload")

client.send("A", zmq.SNDMORE)
client.send("END")

client.send("B", zmq.SNDMORE)
client.send("END")

time.sleep(1)  # Give 0MQ/2.0.x time to flush output

传递的数据结构:
[img]http://github.com/imatix/zguide/raw/master/images/fig34.png[/img]
因为这是无应答的,比较简单,如果要应答的话,会稍微麻烦些,需要用到前面讲的POLLl来调度。在代码中有一行sleep,主要是为了等待接收端准备就绪,否则有可能像"发布/订阅"那样,丢失数据。除了XREP与PUB外,其他类型都不会存在这种问题(都会阻塞等待)。

注意:
在路由模式下,永远是不安全的,想要得到保障,就应该在得到路由信息时答复路由(回应一下)。

(未完待续)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值