在上一节中已经提到XREP主要工作是包装数据,打上标记以便方便的传递数据。那么,换个角度来看,这不就是路由么!其实在
优雅的扩展中有介绍过。在这里针对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.
这里给出一个汇总式的例子:
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
传递的数据结构:
因为这是无应答的,比较简单,如果要应答的话,会稍微麻烦些,需要用到前面讲的POLLl来调度。在代码中有一行sleep,主要是为了等待接收端准备就绪,否则有可能像"发布/订阅"那样,丢失数据。除了XREP与PUB外,其他类型都不会存在这种问题(都会阻塞等待)。
注意:
在路由模式下,永远是不安全的,想要得到保障,就应该在得到路由信息时答复路由(回应一下)。
(未完待续)
分享到:
相关推荐
zeromq-2.1.7.tar.gz 的早期的一个版本,本人已安装成功 放心使用
zeromq-4.0.3.tar.gz zeromq-4.0.3.tar.gz zeromq-4.0.3.tar.gz
zeromq-4.3.2.tar.gz,可在linux下编译安装,能够使用zeromq进行sorket开发,多线程,提升性能,效率,可以配合msgpack进行使用,是个好的扩展插件
zeromq-4.1.3.tar.gz,最新的zeromq的开发工具包,希望对开发者有用
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
zeromq-4.1.8.tar.gz 有问题请联系
zeromq-2.1.9.tar.gz 这是zeromq linux 官方原版 请放心下载
zeromq-4.2.3.tar.gz 一个稳定的版本,可以安装使用!
0MQ version 4.3.4 stable, released on 2021/01/17
storm搭建所需资源
在官网下载zeromq太慢了,网速极不稳定,特意下载放在这里供大家下载,当然象征性地赚点 资源分
ZeroMQ是一个网络通讯库,其主要用来为分布式应用程序开发提供进程间通信(此处的进程既可以是同一台机器上的两个进程也可以是不同机器上的两个进程)。ZeroMQ的特点在于灵活的通信手段和丰富的连接模型,并且它可以...
ZeroMQ是一个网络通讯库,其主要用来为分布式应用程序开发提供进程间通信(此处的进程既可以是同一台机器上的两个进程也可以是不同机器上的两个进程)。ZeroMQ的特点在于灵活的通信手段和丰富的连接模型,并且它可以...
ZMQ(以下ZeroMQ简称ZMQ)是一个简单好用的传输层,像框架一样的一个socket library,他使得Socket编程更加简单、简洁和性能更高。是一个消息处理队列库,可在多个线程、内核和主机盒之间弹性伸缩。
0MQ version 4.3.4 stable, released on 2021/01/17
ZeroMQ(也说明 ØMQ,0MQ 或 ZMQ)是一个高性能的异步消息库,旨在使用分布式或并行应用程序。它提供了一个消息队列,但 不同于面向消息的中间件,一个 ZeroMQ 系统可以在没有专用运行消息代理。jzmq安装包,本人也...
zeroMQ 4.2.3版本 zeromq-4.2.3.tar.gz 欢迎关注我的CSDN博客:https://mp.csdn.net/console/home 免积分下载
zeromq-4.2.5.tar.gz
VS2015 在Widows 10 上编译的 ZeroMQ 4.3.2,JZMQ 3.1 CZMQ 4.2,可以在 JDK 1.8 下运行。DLL 都是 64位,包含了编译及运行相关信息。分享一下,也给自己留个备份