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套接字请求回应,发布订阅模式可以对服务器的信息进行过滤,管道模式通过一个第三方来存储客户端发送,服务器端接受的数据,提供一个缓存的作用。弥补了广播订阅模式在客户端无法收到下线到再次上线之间服务器端的数据的缺陷。

ZeroMQ使用学习记录(转)的更多相关文章

  1. zeromq学习记录(一)最初的简单示例使用ZMQ_REQ ZMQ_REP

    阅读zeromq guide的一些学习记录 zeromq官方例子 在VC下运行会有些跨平台的错误 我这里有做修改 稍后会发布出来 相关的代码与库  http://download.zeromq.org ...

  2. Quartz 学习记录1

    原因 公司有一些批量定时任务可能需要在夜间执行,用的是quartz和spring batch两个框架.quartz是个定时任务框架,spring batch是个批处理框架. 虽然我自己的小玩意儿平时不 ...

  3. Java 静态内部类与非静态内部类 学习记录.

    目的 为什么会有这篇文章呢,是因为我在学习各种框架的时候发现很多框架都用到了这些内部类的小技巧,虽然我平时写代码的时候基本不用,但是看别人代码的话至少要了解基本知识吧,另外到底内部类应该应用在哪些场合 ...

  4. Apache Shiro 学习记录4

    今天看了教程的第三章...是关于授权的......和以前一样.....自己也研究了下....我觉得看那篇教程怎么说呢.....总体上是为数不多的精品教程了吧....但是有些地方确实是讲的太少了.... ...

  5. UWP学习记录12-应用到应用的通信

    UWP学习记录12-应用到应用的通信 1.应用间通信 “共享”合约是用户可以在应用之间快速交换数据的一种方式. 例如,用户可能希望使用社交网络应用与其好友共享网页,或者将链接保存在笔记应用中以供日后参 ...

  6. UWP学习记录11-设计和UI

    UWP学习记录11-设计和UI 1.输入和设备 通用 Windows 平台 (UWP) 中的用户交互组合了输入和输出源(例如鼠标.键盘.笔.触摸.触摸板.语音.Cortana.控制器.手势.注视等)以 ...

  7. UWP学习记录10-设计和UI之控件和模式7

    UWP学习记录10-设计和UI之控件和模式7 1.导航控件 Hub,中心控件,利用它你可以将应用内容整理到不同但又相关的区域或类别中. 中心的各个区域可按首选顺序遍历,并且可用作更具体体验的起始点. ...

  8. UWP学习记录9-设计和UI之控件和模式6

    UWP学习记录9-设计和UI之控件和模式6 1.图形和墨迹 InkCanvas是接收和显示墨迹笔划的控件,是新增的比较复杂的控件,这里先不深入. 而形状(Shape)则是可以显示的各种保留模式图形对象 ...

  9. UWP学习记录8-设计和UI之控件和模式5

    UWP学习记录8-设计和UI之控件和模式5 1.日历.日期和时间控件 日期和时间控件提供了标准的本地化方法,可供用户在应用中查看并设置日期和时间值. 有四个日期和时间控件可供选择,选择的依据如下: 日 ...

随机推荐

  1. 2016-2017 ACM-ICPC, Egyptian Collegiate Programming Contest (ECPC 16)

    A.The game of Osho(sg函数+二项展开) 题意: 一共有G个子游戏,一个子游戏有Bi, Ni两个数字.两名玩家开始玩游戏,每名玩家从N中减去B的任意幂次的数,直到不能操作判定为输.问 ...

  2. Sublime Text 2 HTML代码缩进 美化HTML代码

    关于代码格式的美化,之前在win下一直用“alignment”这个插件,它能实现一键对齐和缩进.最近使用mac版的sublime text 2,不知道是什么原因,这个插件疑似失效…… 这对有洁癖的完美 ...

  3. webpack watch模式产生*.hot-update.json文件

    webpack --watch会产生*.hot-update.json文件,解决方法如下: output: { path: path.join(root, "dist"), fil ...

  4. unicode 编码在线转换工具--javascript

    http://www.cnblogs.com/mq0036/p/4007452.html

  5. dom内容区域的滚动overflow,scroll

    去掉手机上点击点中的默认高亮效果 -webkit-tap-highlight-color: rgba(0,0,0,0); ios手动启动一下监听touch事件以响应css伪类: document.ad ...

  6. HDU1710---树(知前序遍历与中序遍历 求后序遍历)

    知前序遍历与中序遍历 求后序遍历 #include<iostream> #include<cstring> #include<queue> #include< ...

  7. 微信设置URL之WebApi方式

    微信公众号开发者设置里的URL,现在采用WebAPI的方式,结果一直报“未能正确设置Token”的错误,采用Handler和MVC的方式倒是可以. 解决步骤一,添加服务器IP到白名单. 解决步骤二,确 ...

  8. 2018多校第三场 hdu6331 M :Walking Plan

    题目链接 hdu6331 自我吐槽,这场多校大失败,开局签到因输入输出格式写错,wa了3发.队友C题wa了1个小时,还硬说自己写的没错,结果我随便造了个小数据,他都没跑对.然后跑对了后又进入了无限的卡 ...

  9. TemplateBinding和Binding

    TemplateBinding是Binding的一个轻量级版本,它失去了成熟版本Binding的很多功能,比如继承内容引用(inheritence context referencing),Relat ...

  10. 不错的usb分析工具!!!---用bus hound分析usb的枚举过程【转】

    转自:http://blog.chinaunix.net/uid-25909619-id-3335199.html 说明:由于分析时是在记事本上分析的,贴到这里出现了格式有点乱,看时请复制到记事本中, ...