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(1000):

    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(1)

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, "2")

 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(10):
    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(1)

    socket.send(b"World")

可以没有先后启动顺序,假如A先启动,阻塞;假如B先启动,等待请求接入。

过程中,假如A挂掉,再启动,可以继续请求应答;而假如时B服务端挂掉再重启,则A客户端已经连不上了,阻塞。情形和以上几种模式一样的。

总结:

以上是通过官网python bind的源码做的实验。虽然不要求客户端/服务端的先后启动次序,但是中途若是服务端挂掉再启动,就是另一种情况了。在表现形式上来说,似乎此时的c/s线路不再是挂掉之前的,而是服务端又启动了一条线路一样。这个时候,就需要客户端去检测判断服务端状态,以确定重连机制。到底是不是这样呢?需要深入zeromq的代码一看究竟了!

原文地址:https://www.cnblogs.com/thingk/p/8433399.html

时间: 2024-10-12 13:18:02

zeromq使用模式实验总结的相关文章

ZeroMQ各模式总结

ZeroMQ基本的模式有三种:请求-应答.订阅-分发.管道 请求应答模式中, 应答端必须先启动,不然请求端无法连接到应答端,(rep-req) 这两个套接字的非阻塞版本,叫做XREQ和XREP.这些"扩展的请求/应答"套接字允许你通过中间件扩展请求-应答模型 订阅-分发模式,无先后启动问题, 其中push-pull模式,push会负载均衡的将消息分发到pull端.push端无法recv,pull无法send pub-sub模式,sub端(接收端)再连接到服务器后,需要调用zmq_set

Android中Activity的四大启动模式实验简述

作为Android四大组件之一,Activity可以说是最基本也是最常见的组件,它提供了一个显示界面,从而实现与用户的交互,作为初学者,必须熟练掌握.今天我们就来通过实验演示,来帮助大家理解Activity的四大启动模式. 演示效果如下: 第一步:实验前准备,相关配置文件以及Activity的建立 (1)AndroidMainfest.xml配置文件 1 <?xml version="1.0" encoding="utf-8"?> 2 <manif

LVS-NAT模式实验

环境: CIP是客户端的IP地址,VIP是对外公开的IP地址(就是客户端能访问到的IP地址),DIP是负载均衡器与后端的web服务器通信的IP地址,RIP则是后端web服务器的IP地址. 特别说明:有些朋友做实验客户端发现无法访问到后端的web服务器,原因在于后端的RIP服务器没有将网关指向DIP. NAT模式的访问流程大概如下: CIP发起请求到VIP,VIP通过DIP把请求转发给后端的RIP,RIP处理完请求后,把响应结果返回给DIP,DIP返回给VIP,VIP返回给CIP. IP地址分配:

centos救援模式实验笔记

1.  首先在BIOS中把启动选项设置成DVD光驱启动或者USB启动也是可以的 2.  从光盘启动之后再出现的选项中选择"Rescue installed system"然后按回车确认,具体图下图: 3.语言选择,这里我们选择默认的就可以了,因为不是图形化得,所以没有办法支持中文,键盘也选择默认然后按回车,具体如下图: 4.  在SetupNetworking这里我们根据自己的需要来确认是否启用网络,这里我选择的是不启用,如图: 5.  Continue是让虚拟系统(也就是Rescue

ZeroMQ 的模式

在需要并行化处理数据的时候,采用消息队列通讯的方式来协作,比采用共享状态的方式要好的多.Erlang ,Go 都使用这一手段来让并行任务之间协同工作. 最近读完了 ZeroMQ 的 Guide.写的很不错.前几年一直有做类似的工作,但是自己总结的不好.而 ZeroMQ 把消息通讯方面的模式总结的很不错. ZeroMQ 并不是一个对 socket 的封装,不能用它去实现已有的网络协议.它有自己的模式,不同于更底层的点对点通讯模式.它有比 tcp 协议更高一级的协议.(当然 ZeroMQ 不一定基于

记一次keepalived双主DR模式实验

实验环境 CENTOS 7.5DIP1 192.168.119.110DIP2 192.168.119.111RIP1 192.168.119.120RIP2 192.168.119.121VIP1 192.168.119.130VIP2 192.168.119.131双主模式需要准备两个VIP DS上安装 yum install -y keepalived ipvsadm修改配置文件 vim /etc/keepalived/keepalived.confDS1上 ! Configuration

LVS调度器中NAT工作模式实验

LVS群集创建与管理使用ipvsadm工具Network File System,网络文件系统 依赖于RPC(远端过程调用) 需要安装nfs-utils.rpcbind软件包 系统服务:nfs.rpcbind 共享配置文件:/etc/exports案例环境 LVS调度器作为web服务器池的网关,LVS两块网卡,分别连接内外网,使用轮询(rr)调度算法实验案例图实验过程一.配置NFS存储服务器,提供存储空间1.首先为nfs服务器添加两块硬盘2.添加硬盘后重启服务器3.为每台服务器修改主机名,方便识

CentOS7系统LVS-DR模式实验

配置LVS DR 模式 环境 五台CentOS7虚拟机 (管理IP均未配置网关) 客户端 管理IP:172.20.1.2 访问IP:192.168.1.2 路由器 管理IP:172.20.1.253 eth1:192.168.1.253 eth2:192.168.2.253 LVS服务器 管理IP:172.20.1.100 DIP:192.168.2.100 网关192.168.2.253 VIP:192.168.2.101 Real Server1 管理IP:172.20.1.81 RIP:1

实验一:路由器的配置模式

实验一:路由器的配置模式 实验目的:熟悉路由器的各个配置模式,熟练hostname,enable,password,enable password ,secret,config terminal等命令的使用. 实验要求: 1.能够使用口令登录路由器 2.能够用enable 进入特权模式,用config terminal进入配置模式. 3.会使用命令提示,察看各模式下的可用命令. 实验设备:cisco路由器一台,pc一台 实验步骤: 1.首先用一根交叉线将PC与路由器的配置端口(console)连