相关链接:

  • 官网API:http://api.zeromq.org/
  • GitHub: https://github.com/zeromq
  • 操作指南:http://zguide.zeromq.org/page:all
  • **ZMQ 中文指南: **https://github.com/anjuke/zguide-cn
  • **官网指南示例GitHub: **https://github.com/booksbyus/zguide

ZeroMQ的模式分类

ZeroMQ模式在zmq_socket()接口中有介绍,可以参阅:http://api.zeromq.org/master:zmq-socket

zmq_socket

zmq_socket - 创建0MQ套接字

void *zmq_socket (void *context, int type);

zmq_socket()函数将在指定的上下文中创建一个ZeroMQ套接字,并返回新创建的套接字

type 类型参数指定套接字类型,它确定套接字上通信的语义。

MQ套接字是异步的,这意味着物理连接设置和拆卸、重新连接和有效传递的时间对用户是透明的,并且是由MQ本身组织的。此外,如果对等方无法接收消息,则可能会排队。

与传统套接字的关键区别

一般来说,传统的套接字是 1、面向连接的可靠字节流(SOCK_STREAM) 或者 2、不可靠的数据报(SOCK_DGRAM),并为其提供同步接口。

相比之下,ZeroMQ套接字是对异步消息队列的抽象。根据使用的套接字type 类型的不同,而具有不同的模式。传统套接字传输字节流或离散数据报,ZeroMQ套接字传输离散消息。

ZeroMQ套接字是异步的,意味着物理连接的建立与断开,重连,数据有效传输,对用户是透明的,并ZeroMQ组织处理。此外,如果对方无法接收消息,那么消息可能会排队。

传统的套接字只允许 严格的一对一(两个对等点)、多对一(多个客户机、一个服务器),或者在某些情况下只允许的一对多(多播) 关系。除了ZMQ_PAIR之外,ZeroMQ套接字可以使用ZMQ_CONNECT() http://api.zeromq.org/master:zmq-connect连接到多个端点,同时接受来自使用ZMQ_BIND() http://api.zeromq.org/master:zmq-bind 绑定到套接字的多个端点的传入连接,从而允许多到多关系。

Socket types 类型

type 设置不同的值决定了ZeroMQ Socket 的不同类型,也就是ZeroMQ的不同模式:

客户端-服务器模式(Client-server) 、 广播盘模式(Radio-dish)、发布订阅模式(Publish-subscribe)、流水线模式(Pipeline pattern)、独占对模式(Exclusive pair)、本机模式(Native)、请求-回复模式(Request-reply)

客户端-服务器模式(Client-server)

  • types 类型:ZMQ_CLIENT 、ZMQ_SERVER

  • 客户机-服务器模式用于允许一个ZMQ_SERVER服务器与一个或多个ZMQ_CLIENT客户机通信。客户端总是启动对话,之后任何一方都可以向另一方异步发送消息

  • 客户机-服务器模式由http://rfc.zeromq.org/spec:41正式定义,该模式仍在草案阶段

广播盘模式(Radio-dish)

  • types 类型:ZMQ_RADIO、ZMQ_DISH

  • 广播盘模式用于从单个发行者到多个订阅者的一对多的数据分发。

  • 广播碟仍处于草案阶段

发布订阅模式(Publish-subscribe)

  • types 类型:ZMQ_PUB、ZMQ_SUB、ZMQ_XPUB、ZMQ_XSUB

  • 发布-订阅模式用于从单个发布服务器到多个订阅者的一对多的数据分发。

  • 发布-订阅模式由http://rfc.zeromq.org/spec:29正式定义

ZMQ_PUB

  • 发布者使用类型为ZMQ_PUB的套接字来分发数据。发送的消息以扇形的方式分发给所有连接的订阅者。
  • 对于此套接字类型,不能执行zmq_recv() http://api.zeromq.org/master:zmq-recv函数。

ZMQ_SUB

  • 订阅者使用ZMQ_SUB类型的套接字来订阅发布者分发的数据

  • ZMQ_SUB套接字创建完成之后,ZMQ_SUB套接字未订阅任何消息,请使用zmq_setsockopt() http://api.zeromq.org/master:zmq-setsockopt的ZMQ_SUBSCRIBE选项指定要订阅的消息

ZMQ_XPUB

  • 用法与ZMQ_PUB大部分相同,但是有一点与ZMQ_PUB不同。ZMQ_XPUB(自己)的订阅方可以向自己发送一个订阅信息来进行订阅。订阅消息是字节1(用于订阅)或字节0(用于取消订阅),后跟订阅主体。

ZMQ_XSUB

  • 用法与ZMQ_SUB大部分相同,但是有一点与ZMQ_SUB不同。自己可以向发布者发送一条订阅信息来进行订阅。订阅消息是字节1(用于订阅)或字节0(用于取消订阅),后跟订阅主体。

示例代码:

使用:zeromq/libzmq 的 libzmq 4.3.3

API接口: http://api.zeromq.org

GitHub: PublishSubscribeDemo

发布者代码:

//  Binds PUB socket to tcp://*:5556
//  Publishes random weather updates
#include "zhelpers.h"int main (void)
{//  Prepare our context and publishervoid *context = zmq_ctx_new ();void *publisher = zmq_socket (context, ZMQ_PUB);int rc = zmq_bind (publisher, "tcp://*:5556");assert (rc == 0);//  Initialize random number generatorsrandom ((unsigned) time (NULL));while (1) {//  Get values that will fool the bossint zipcode, temperature, relhumidity;zipcode     = randof (100000);temperature = randof (215) - 80;relhumidity = randof (50) + 10;//  Send message to all subscriberschar update [20];sprintf (update, "%05d %d %d", zipcode, temperature, relhumidity);s_send (publisher, update);}zmq_close (publisher);zmq_ctx_destroy (context);return 0;
}

订阅者代码:

//  Weather update client
//  Connects SUB socket to tcp://localhost:5556
//  Collects weather updates and finds avg temp in zipcode
#include "zhelpers.h"int main (int argc, char *argv [])
{//  Socket to talk to serverprintf ("Collecting updates from weather server...\n");void *context = zmq_ctx_new ();void *subscriber = zmq_socket (context, ZMQ_SUB);int rc = zmq_connect (subscriber, "tcp://localhost:5556");assert (rc == 0);//  Subscribe to zipcode, default is NYC, 10001const char *filter = (argc > 1)? argv [1]: "10001 ";rc = zmq_setsockopt (subscriber, ZMQ_SUBSCRIBE,filter, strlen (filter));assert (rc == 0);//  Process 100 updatesint update_nbr;long total_temp = 0;for (update_nbr = 0; update_nbr < 100; update_nbr++) {char *string = s_recv (subscriber);int zipcode, temperature, relhumidity;sscanf (string, "%d %d %d",&zipcode, &temperature, &relhumidity);total_temp += temperature;free (string);}printf ("Average temperature for zipcode '%s' was %dF\n",filter, (int) (total_temp / update_nbr));zmq_close (subscriber);zmq_ctx_destroy (context);return 0;
}

流水线模式(Pipeline pattern)

  • types 类型:ZMQ_PUSH、ZMQ_PULL

  • 所述流水线模式用于将数据分配给排列在管道中的节点。数据总是沿着管道流动,管道的每个阶段都连接到至少一个节点。当一个管道连接到多个节点时,数据在所有连接节点之间被循环。

  • 流水线模式由http://rfc.zeromq.org/spec:30正式定义

ZMQ_PUSH

管道节点使用ZMQPush类型的套接字向下游管道节点发送消息。消息被循环到所有连接的下游节点。不能执行zmq_recv() http://api.zeromq.org/master:zmq-recv。

ZMQ_PULL

管道节点使用ZMQ_PULL类型的套接字从上游管道节点接收消息。消息从所有连接的上游节点中公平排队。不能执行zmq_send() http://api.zeromq.org/master:zmq-send。

独占对模式(Exclusive pair)

  • types 类型:ZMQ_PAIR

  • 独占对模式用于将对等点连接到另一个对等点。

  • 独占对模式由http://rfc.zeromq.org/spec:31正式定义

ZMQ_PAIR

ZMQ_PAIR类型的套接字在任何时候只能连接到一个对等点。不对通过ZMQ_PAIR套接字发送的消息执行任何消息路由或筛选。

本机模式(Native)

  • types 类型:ZMQ_STREAM

  • 本机模式用于与TCP对等点通信,并允许任何方向的异步请求和答复。

请求-回复模式(Request-reply)

  • types 类型:ZMQ_REQ、ZMQ_REP、ZMQ_DEALER、ZMQ_ROUTER

  • Request-Reply模式用于从ZMQ_REQ客户端向一个或多个ZMQ_REP服务发送请求,并接收发送的每个请求的后续答复。

ZMQ_REQ

客户端使用ZMQ_REQ类型的套接字向服务发送请求并接收服务的答复。此套接字类型只允许交替的ZMQ_Send和ZMQ_recv调用。如果没有可用的服务,则套接字上的任何发送操作都应阻塞,直到至少有一项服务可用为止。REQ套接字不会丢弃消息。

ZMQ_REP

服务使用ZMQ_REP类型的套接字来接收来自客户端的请求并发送答复。此套接字类型只允许交替的ZMQ_Send和ZMQ_recv调用。如果原始请求者不再存在,则答复将被静默丢弃。

ZMQ_DEALER

ZMQ_ARIRER类型的套接字是用于扩展请求/应答套接字的高级模式。

ZMQ_ROUTER

ZMQ_ROUTER类型的套接字是用于扩展请求/应答套接字的高级模式。

示例代码:

使用:zeromq/libzmq 的 libzmq 4.3.3

API接口: http://api.zeromq.org

GitHub: HelloWorld

server代码:

//  Hello World server#include <zmq.h>
#include <stdio.h>
#include <unistd.h>
#include <assert.h>int main (void)
{int major, minor, patch;zmq_version(&major, &minor, &patch); // 获取当前使用的ZeroMQ的版本号printf("Current ZeroMQ version is %d.%d.%d\n", major, minor, patch);///  1.创建上下文void *context = zmq_ctx_new ();   // 创建 0MQ上下文  线程安全的/// // 2.创建、绑定套接字// ZMQ_REP 服务使用ZMQ_REP类型的套接字来接收来自客户端的请求并向客户端发送回复void *responder = zmq_socket (context, ZMQ_REP);int rc = zmq_bind (responder, "tcp://*:5555");assert (rc == 0);/// 3.循环接收数据、发送数据while (1) {char buffer [10];/// 4.接收数据zmq_recv (responder, buffer, 10, 0);printf ("Received Hello\n");sleep (1);/// 5.回送数据zmq_send (responder, "World", 5, 0);}return 0;
}

client代码:

//  Hello World client
#include <zmq.h>
#include <stdio.h>int main (void)
{printf ("Connecting to hello world server...\n");/// 1、创建上下文void *context = zmq_ctx_new ();   // 创建 0MQ上下文  线程安全的/// 2.创建、绑定套接字// ZMQ_REQ  客户端使用ZMQ_REQ类型的套接字向服务发送请求并从服务接收答复void *requester = zmq_socket (context, ZMQ_REQ);zmq_connect (requester, "tcp://localhost:5555");///3.循环发送数据、接收数据int request_nbr;for (request_nbr = 0; request_nbr != 10; request_nbr++) {char buffer [10];printf ("Sending Hello %d...\n", request_nbr);/// 4.发送数据zmq_send (requester, "Hello", 5, 0);// 5.接收回复数据zmq_recv (requester, buffer, 10, 0);printf ("Received World %d\n", request_nbr);}/// 6.关闭套接字、销毁上下文zmq_close (requester);zmq_ctx_destroy (context);return 0;
}

ZeroMQ模式介绍相关推荐

  1. LVS三种工作模式介绍对比和十种调度算法介绍

    2019独角兽企业重金招聘Python工程师标准>>> 工作模式介绍: 1.Virtual server via NAT(VS-NAT) 优点:集群中的物理服务器可以使用任何支持TC ...

  2. Java中的单利模式介绍

    单利模式:本来是不准备写的,但是最近发现好多公司面试时都会或多或少的提到单利模式,因此今天把单利模式拉出来说说. 定义:只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且 ...

  3. 《研磨设计模式》chap25 访问者模式Visitor(1)模式介绍

    场景:给用户做服务,分为个人用户.企业用户,服务不断地变. 1. 正常编码(不使用模式) public abstract class Customer {private String customer ...

  4. k8s控制器模式介绍

    k8s控制器模式介绍

  5. [深度学习] 分布式模式介绍(一)

    [深度学习] 分布式模式介绍(一) [深度学习] 分布式Tensorflow介绍(二) [深度学习] 分布式Pytorch 1.0介绍(三) [深度学习] 分布式Horovod介绍(四) 一  分布式 ...

  6. rsync的介绍及参数详解,配置步骤,工作模式介绍

    rsync的介绍及参数详解,配置步骤,工作模式介绍 rsync是类unix系统下的数据镜像备份工具.它是快速增量备份.全量备份工具. Sync可以远程同步,支持本地复制,或者与其他SSH.rsync主 ...

  7. RabbitMQ七种队列模式介绍与应用场景(通俗易懂)

    七种模式介绍与应用场景 简单模式(Hello World) 做最简单的事情,一个生产者对应一个消费者,RabbitMQ相当于一个消息代理,负责将A的消息转发给B 应用场景:将发送的电子邮件放到消息队列 ...

  8. java装饰者模式讲解视频教程_java装饰者模式介绍(图文教程)

    java装饰者模式介绍(图文教程).装饰者模式UML类图: 装饰者模式UML类图 java装饰者模式知识要点 装饰者模式动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更有弹性的替代方案. ...

  9. python命令行模式和交互模式区别_对命令行模式与python交互模式介绍

    命令行模式与python交互模式 1.在命令行模式下,可以执行 python 进入 Python 交互式环境,也可以执 行 python hello.py 运行一个.py 文件. 2.在 Python ...

  10. 用C#实现MVC(Model View Control)模式介绍

    用C#实现MVC(Model View Control)模式介绍 作者:Matthew Cochran December 12, 2005 原文地址:http://www.c-sharpcorner. ...

最新文章

  1. Eigen: C++开源矩阵计算工具——Eigen的简单用法
  2. 《机器学习》 梯度下降
  3. myeclipse + maven项目创建
  4. Android -- 带你从源码角度领悟Dagger2入门到放弃(一)
  5. centos在线安装mysql
  6. android添加hidl,android hidl
  7. python编程(python调用dll程序)
  8. 漫画:如何给女朋友解释灭霸的响指并不是真随机消灭半数宇宙人口的?
  9. 图像处理随笔——soft-nms
  10. Python2 和 pip2 存在, Python3 也存在,但是 pip3 不存在的解决办法
  11. 2022 软件库APP源码前端 后端整套独立后台+搭建教程
  12. CentOS7--安装谷歌浏览器--详细步骤
  13. 算法导论学习笔记12_动态规划
  14. 关于base64编码解码(Android编码,JS解码,案例为解决安卓端H5页面的emoji表情显示问题)
  15. 蚁群算法java实现_简单蚁群算法 + JAVA实现蚁群算法
  16. 计算机组成原理学习笔记——机器指令的基本结构
  17. 中国茶叶分类图(转载)
  18. unity3D 下雨效果实现
  19. 基于过程的软件测试全景图 (2)
  20. 2019年09月VOA慢速英语听力音频打包下载(音频+字幕+文本)

热门文章

  1. LESS CSS 框架简介
  2. python中集合可以使用下标吗_Python之集合
  3. python中减号怎么打_python减号
  4. 计算机专业 外文数据库,计算机专业外文翻译+原文-数据库管理系统介绍
  5. 趋势linux版本杀毒软件,万万没想到,微软 Linux 版杀软来了
  6. 计算机无法打开注册表,电脑无法打开注册表怎么办
  7. 国密SM2系列算法验证工具
  8. 杭州电子科技大学研究生计算机科学与技术,杭州电子科技大学-硕士研究生-计算机学院 2018级计算机科学与技术(中日合作)培养方案...
  9. Android OpenGL ES(七)----理解纹理与纹理过滤
  10. R中设置图形参数--函数par()详解