ZMQ简介
ZMQ(ØMQ、ZeroMQ, 0MQ)看起来像是一套嵌入式的网络链接库,但工作起来更像是一个并发式的框架。它提供的套接字可以在多种协议中传输消息,如线程间、进程间、TCP、广播等。你可以使用套接字构建多对多的连接模式,如扇出、发布-订阅、任务分发、请求-应答等。ZMQ的快速足以胜任集群应用产品。它的异步I/O机制让你能够构建多核应用程序,完成异步消息处理任务。ZMQ有着多语言支持,并能在几乎所有的操作系统上运行。ZMQ是iMatix公司的产品,以LGPL开源协议发布。
主要有下列三种模式
1.Request-Reply模式:请求响应模式
客户端在请求后,服务端必须回响应
server:
1 #!/usr/bin/python 2 #-*-coding:utf-8-*- 3 import time 4 import zmq 5 6 context = zmq.Context() 7 socket = context.socket(zmq.REP) 8 socket.bind("tcp://*:5555") 9 10 while True: 11 message = socket.recv() 12 print message 13 #time.sleep(1) 14 socket.send("server response!")
client:
1 #!/usr/bin/python 2 #-*-coding:utf-8-*- 3 4 import zmq 5 import sys 6 7 context = zmq.Context() 8 socket = context.socket(zmq.REQ) 9 socket.connect("tcp://localhost:5555") 10 11 while(True): 12 data = raw_input("input your data:") 13 if data == 'q': 14 sys.exit() 15 16 socket.send(data) 17 18 response = socket.recv(); 19 print response
2.Publish-Subscribe模式:发布订阅模式
广播所有client,没有队列缓存,断开连接数据将永远丢失。client可以进行数据过滤。
server:
1 #!/usr/bin/python 2 #-*-coding:utf-8-*- 3 4 import zmq 5 context = zmq.Context() 6 socket = context.socket(zmq.PUB) 7 socket.bind("tcp://127.0.0.1:5000") 8 while True: 9 msg = raw_input('input your data:') 10 socket.send(msg)
client:
1 #!/usr/bin/python 2 #-*-coding:utf-8-*- 3 4 import time 5 import zmq 6 context = zmq.Context() 7 socket = context.socket(zmq.SUB) 8 socket.connect("tcp://127.0.0.1:5000")
#此处进行过滤,socket.setsockopt(zmq.SUBSCRIBE, "A")表示只接收信息中头部为A的信息,其他的省略 9 socket.setsockopt(zmq.SUBSCRIBE,'') 10 while True: 11 print socket.recv()
关于发布-订阅模式的几点说明:
- 订阅者可以连接多个发布者,轮流接收消息;
- 如果发布者没有订阅者与之相连,那它发送的消息将直接被丢弃;
- 如果你使用TCP协议,那当订阅者处理速度过慢时,消息会在发布者处堆积。以后我们会讨论如何使用阈值(HWM)来保护发布者。
- 在目前版本的ZMQ中,消息的过滤是在订阅者处进行的。也就是说,发布者会向订阅者发送所有的消息,订阅者会将未订阅的消息丢弃。
3.Parallel Pipeline模式:管道模式
由三部分组成,push进行数据推送,work进行数据缓存,pull进行数据竞争获取处理。区别于Publish-Subscribe存在一个数据缓存和处理负载。
当连接被断开,数据不会丢失,重连后数据继续发送到对端。
server:
1 #!/usr/bin/python 2 #-*-coding:utf-8-*- 3 4 import zmq 5 6 context = zmq.Context() 7 8 socket = context.socket(zmq.PULL) 9 socket.bind('tcp://*:5558') 10 11 while True: 12 data = socket.recv() 13 print data
work:
1 #!/usr/bin/python 2 #-*-coding:utf-8-*- 3 4 import zmq 5 6 context = zmq.Context() 7 8 recive = context.socket(zmq.PULL) 9 recive.connect('tcp://127.0.0.1:5557') 10 11 sender = context.socket(zmq.PUSH) 12 sender.connect('tcp://127.0.0.1:5558') 13 14 while True: 15 data = recive.recv() 16 sender.send(data)
client:
1 #!/usr/bin/python 2 #-*-coding:utf-8-*- 3 4 import zmq 5 import time 6 7 context = zmq.Context() 8 socket = context.socket(zmq.PUSH) 9 10 socket.bind('tcp://*:5557') 11 12 while True: 13 data = raw_input('input your data:') 14 socket.send(data)
转自http://www.cnblogs.com/binchen-china/p/5643531.html
按个人理解简要描述下三种模式的区别,应答模式就是普通的socket套接字请求回应,发布订阅模式可以对服务器的信息进行过滤,管道模式通过一个第三方来存储客户端发送,服务器端接受的数据,提供一个缓存的作用。弥补了广播订阅模式在客户端无法收到下线到再次上线之间服务器端的数据的缺陷。