zeromq使用模式实验总结
zeromq:官网 安装 demo及各语言绑定 golang绑定
实验环境:win10 x64/centos6 x86 zeromq4.0.6
zmq三种模式:push/pull、pub/sub、req/resp
一、push/pull模式:

A程序PUSH代码如下:
import zmq
import time
context = zmq.Context() sender = context.socket(zmq.PUSH)
sender.bind("tcp://*:5557") for task_nbr in range(): workload = 'task2---'+str(task_nbr)
sender.send_string(u'%s' % workload)
time.sleep(0.1)
B程序PULL代码如下:
import time
import zmq context = zmq.Context() receiver = context.socket(zmq.PULL)
receiver.connect("tcp://localhost:5557") while True: s = receiver.recv()
time.sleep()
A程序准备发送1000个task任务,完事退出;B程序一直pull。
A先启动,此时push会一直阻塞,直到有一个pull连接,task才发出,假如中途B挂掉,A也继续进入阻塞,B再次上线,pull开始从上次A阻塞时的任务拉取。假如A挂掉,task任务发送中断,则B一直pull到A挂前发出的任务为止,这时候A再重启上线,则是另一回事了,任务for循环又重新开始,B继续。
B先启动,A后启动,场景和以上A先启动一样。
push一端具有负载均衡功能,pull一端可以多启动几个实例,均衡执行task,若中途pull一端挂掉,则push自动把任务分发到其他pull上。
二、 pub/sub模式

A程序代码如下:
pub_Queue = Queue.Queue()
context = zmq.Context()
publisher = context.socket(zmq.PUB)
publisher.bind("tcp://*:5557") while True:
publisher.send_string(msg)
BCD代码如下:
context = zmq.Context()
subscriber = context.socket(zmq.SUB)
subscriber.connect("tcp://*:5557")
subscriber.setsockopt(zmq.SUBSCRIBE, "") while True: contents = subscriber.recv()
print("%s" % contents)
A pub端通过sub端subscriber.setsockopt(zmq.SUBSCRIBE, "2")的“2”过滤信息,sub端可以订阅多个。远程公网使用该模式,需要pub端定期维持心跳包,比如半分钟pub一条信息。
三、req/resp模式

A程序代码如下:
import zmq context = zmq.Context() socket = context.socket(zmq.REQ)
socket.connect("tcp://localhost:5555") for request in range():
socket.send(b"Hello") message = socket.recv()
print "Received reply %s [ %s ]" % (request, message)
B程序代码如下:
import time
import zmq context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind("tcp://*:5555") while True:
message = socket.recv() time.sleep() socket.send(b"World")
可以没有先后启动顺序,假如A先启动,阻塞;假如B先启动,等待请求接入。
过程中,假如A挂掉,再启动,可以继续请求应答;而假如时B服务端挂掉再重启,则A客户端已经连不上了,阻塞。情形和以上几种模式一样的。
总结:
以上是通过官网python bind的源码做的实验。虽然不要求客户端/服务端的先后启动次序,但是中途若是服务端挂掉再启动,就是另一种情况了。在表现形式上来说,似乎此时的c/s线路不再是挂掉之前的,而是服务端又启动了一条线路一样。这个时候,就需要客户端去检测判断服务端状态,以确定重连机制。到底是不是这样呢?需要深入zeromq的代码一看究竟了!
zeromq使用模式实验总结的更多相关文章
- OpenDayLight Helium实验一 OpenDaylight的C/S模式实验
本文基于:OpenDaylight的C/S模式实验而成 C/S 结构,即大家熟知的客户机和服务器结构.它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Ser ...
- LVS DR模式实验
LVS DR模式实验 三台虚拟机,两个台节点机(Apache),一台DR实验调度机 一:关闭相关安全机制 systemctl stop firewalld iptables -F setenforce ...
- Android中Activity的四大启动模式实验简述
作为Android四大组件之一,Activity可以说是最基本也是最常见的组件,它提供了一个显示界面,从而实现与用户的交互,作为初学者,必须熟练掌握.今天我们就来通过实验演示,来帮助大家理解Activ ...
- 聊聊Dataguard的三种保护模式实验(上)
Data Guard是Oracle高可用性HA的重要解决方案.针对不同的系统保护需求,DG提供了三种不同类型的保护模式(Protection Mode),分别为:最大保护(Maximum Protec ...
- ZeroMQ 的模式
在需要并行化处理数据的时候,采用消息队列通讯的方式来协作,比采用共享状态的方式要好的多.Erlang ,Go 都使用这一手段来让并行任务之间协同工作. 最近读完了 ZeroMQ 的 Guide.写的很 ...
- centos救援模式实验笔记
1. 首先在BIOS中把启动选项设置成DVD光驱启动或者USB启动也是可以的 2. 从光盘启动之后再出现的选项中选择“Rescue installed system”然后按回车确认,具体图下图: ...
- 聊聊Dataguard的三种保护模式实验(下)
4.最大保护模式Maximum Protection 最大保护模式是DG可以提供的最高保护级别,建立在日志同步传输和确认的基础上.同样,可以使用alter database方法进行设置. SQL> ...
- Delphi映射模式实验
unit FrmMappingMode; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Contro ...
- x86汇编分页模式实验 --《ORANGE'S一个操作系统的实现》中 pmtest8.asm解析
序言(废话) : 在看书的过程中发现一开始不是很能理解pmtest8的目的,以及书上说得很抽象..于是在自己阅读过源代码后,将一些自己的心得写在这里. 正文 : 讲解顺序依然按照书上贴代码的顺序来.但 ...
随机推荐
- 如何在IntelliJ IDEA中使用Git .ignore插件忽略不必要提交的文件
参考 https://blog.csdn.net/qq_34590097/article/details/56284935 最近初学Git,而且在使用的IDE是IntelliJ IDEA,发现IDE ...
- Microsoft/Git-Credential-Manager-for-Mac-and-Linux
纠正Mac上的错误: Fatal: java.lang.Error encountered. Details: unexpected errorfatal: credential helper '!/ ...
- hihocoder第238周:杨氏矩阵的个数
题目链接 问题描述 给定一个N行M列的矩阵,往里面填入$1-N\times M$个数字,使得这个矩阵每行.每列都满足递增.问:有多少种填法? 问题分析 这个问题很难,如果能够直接想到,那就是天才了. ...
- C#-MVC开发微信应用(2)--微信消息的处理和应答
微信应用使用场景和商机很多,所以这也是一个技术的方向,因此,有空研究下.学习下微信的相关开发,也就成为SNF完善的必要条件了.本系列文章希望从一个循序渐进的角度上,全面介绍微信的相关开发过程和相关经验 ...
- Bash 中的特殊字符大全【转】
Linux下无论如何都是要用到shell命令的,在Shell的实际使用中,有编程经验的很容易上手,但稍微有难度的是shell里面的那些个符号,各种特殊的符号在我们编写Shell脚本的时候如果能够用的好 ...
- 【R作图】lattice包,画多个分布柱形图,hist图纵轴转换为百分比
一开始用lattice包,感觉在多元数据的可视化方面,确实做得非常好.各种函数,可以实现任何想要实现的展示. barchart(y ~ x) y对x的直方图 bwplot(y ~ x) 盒形图 den ...
- golang slice
golang 在for range一个slice时,会读出其cap长度.在for的过程中,即使动态append该slice,最终for也会在第一次读取的cap长度处停止. package main i ...
- FFmpeg: AVPacket 结构体分析
AVPacket是FFmpeg中很重要的一个数据结构,它保存了解封装之后,解码之前的数据(注意:仍然是压缩后的数据)和关于这些数据的一些附加信息,如显示时间戳(pts).解码时间戳(dts).数据时长 ...
- Fluent动网格【8】:网格节点运动案例
Fluent动网格中的DEFINE_GRID_MOTION宏允许用户定义网格节点的运动.本案例演示采用DEFINE_GRID_MOTION宏指定边界节点的运动. 案例动网格效果如图所示. 案例描述 本 ...
- What-is-DevOps
https://www.quora.com/What-is-DevOps https://neoteric.eu/blog/devops-a-culture-of-getting-things-don ...