ZeroMQ使用学习记录(转)
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使用学习记录(转)的更多相关文章
- zeromq学习记录(一)最初的简单示例使用ZMQ_REQ ZMQ_REP
阅读zeromq guide的一些学习记录 zeromq官方例子 在VC下运行会有些跨平台的错误 我这里有做修改 稍后会发布出来 相关的代码与库 http://download.zeromq.org ...
- Quartz 学习记录1
原因 公司有一些批量定时任务可能需要在夜间执行,用的是quartz和spring batch两个框架.quartz是个定时任务框架,spring batch是个批处理框架. 虽然我自己的小玩意儿平时不 ...
- Java 静态内部类与非静态内部类 学习记录.
目的 为什么会有这篇文章呢,是因为我在学习各种框架的时候发现很多框架都用到了这些内部类的小技巧,虽然我平时写代码的时候基本不用,但是看别人代码的话至少要了解基本知识吧,另外到底内部类应该应用在哪些场合 ...
- Apache Shiro 学习记录4
今天看了教程的第三章...是关于授权的......和以前一样.....自己也研究了下....我觉得看那篇教程怎么说呢.....总体上是为数不多的精品教程了吧....但是有些地方确实是讲的太少了.... ...
- UWP学习记录12-应用到应用的通信
UWP学习记录12-应用到应用的通信 1.应用间通信 “共享”合约是用户可以在应用之间快速交换数据的一种方式. 例如,用户可能希望使用社交网络应用与其好友共享网页,或者将链接保存在笔记应用中以供日后参 ...
- UWP学习记录11-设计和UI
UWP学习记录11-设计和UI 1.输入和设备 通用 Windows 平台 (UWP) 中的用户交互组合了输入和输出源(例如鼠标.键盘.笔.触摸.触摸板.语音.Cortana.控制器.手势.注视等)以 ...
- UWP学习记录10-设计和UI之控件和模式7
UWP学习记录10-设计和UI之控件和模式7 1.导航控件 Hub,中心控件,利用它你可以将应用内容整理到不同但又相关的区域或类别中. 中心的各个区域可按首选顺序遍历,并且可用作更具体体验的起始点. ...
- UWP学习记录9-设计和UI之控件和模式6
UWP学习记录9-设计和UI之控件和模式6 1.图形和墨迹 InkCanvas是接收和显示墨迹笔划的控件,是新增的比较复杂的控件,这里先不深入. 而形状(Shape)则是可以显示的各种保留模式图形对象 ...
- UWP学习记录8-设计和UI之控件和模式5
UWP学习记录8-设计和UI之控件和模式5 1.日历.日期和时间控件 日期和时间控件提供了标准的本地化方法,可供用户在应用中查看并设置日期和时间值. 有四个日期和时间控件可供选择,选择的依据如下: 日 ...
随机推荐
- BZOJ1823 [JSOI2010]满汉全席 【2-sat】
题目 满汉全席是中国最丰盛的宴客菜肴,有许多种不同的材料透过满族或是汉族的料理方式,呈现在數量繁多的菜色之中.由于菜色众多而繁杂,只有极少數博学多闻技艺高超的厨师能够做出满汉全席,而能够烹饪出经过专家 ...
- BZOJ[Sdoi2014]数表 莫比乌斯反演
[Sdoi2014]数表 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 2383 Solved: 1229[Submit][Status][Disc ...
- Eclipse中使用Maven创建Web时错误
一.问题描述 使用Eclipse创建Maven项目时,报一下错误,不能创建成功. 二.问题原因 错误详细描述是说 Could not resolve archetype org.apache.mave ...
- 取代VS, sourceISight的IDE神器CLION
https://www.jetbrains.com/clion/download/download-thanks.html 随时升级 http://idea.lanyus.com/ m_pRemoti ...
- malloc,calloc,realloc区别
malloc:memory allocation calloc:The 'c' indicates 'cleared' realloc:The realloc() function changes t ...
- springMVC 配置中易犯的小错误
搭建springMVC环境时有可能遇到:'警告: No mapping found for HTTP request with URI [/WEB-INF/pages/helloWorld.jsp] ...
- RMQ-ST算法
1068 : RMQ-ST算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho在美国旅行了相当长的一段时间之后,终于准备要回国啦!而在回国之前,他们准备去 ...
- python笔记-用python解决小学生数学题【转载】
本篇转自博客:上海-悠悠 原文地址:http://www.cnblogs.com/yoyoketang/tag/python/ 前几天有人在群里给小编出了个数学题: 假设你有无限数量的邮票,面值分别为 ...
- 解决:laravel出现Please provide a valid cache path.
SVN检出版本库上的项目后,访问首页出现如下提示: Please provide a valid cache path. 解决方法如下: 1.确保storage目录下有如app,framework,v ...
- EntityFramework之一对多关系(三)
上篇介绍了一对一关系,下面介绍下一对多关系代码编写. 1.新建model实体,Product是产品类,Order是订单,一个产品对应多个订单 public class Product { public ...