zeromq是一个轻量级的消息库。它扩展了标准的套接字接口,其特性与传统的消息中间件不同,zeromq提供异步消息队列、多消息传递模式、消息过滤(订阅)、无缝访问多个传输协议等的抽象。

  本系列API文章基于ZMQ4.1.7编写。

1、上下文

  在使用任何ZMQ的库函数之前,必须创建ZMQ上下文,并且,当你退出程序,也必须销毁上下文,和上下文相关的有这些函数:

  创建上下文:zmq_ctx_new(3)
  获取/设置上下文属性:zmq_ctx_set(3) zmq_ctx_get(3)
  销毁上下文:zmq_ctx_shutdown(3) zmq_ctx_term(3)

1.1 线程安全

  ØMQ上下文是线程安全的,可以根据需要在尽可能多的应用程序线程之间共享,而不需要调用者需要额外的锁定。

  除了在将套接字从一个线程迁移到另一个线程时发出完全内存障碍的情况之外,单个ØMQ套接字不是线程安全的。

  实际上,这意味着应用程序可以使用zmq_socket()在一个线程中创建套接字,然后将其作为线程初始化的一部分传递给新创建的线程,例如通过作为pthread_create()的参数传递的结构。

1.2 多个上下文

  多个上下文可能共存于一个应用程序中。

  因此,应用程序可以直接使用ØMQ,并且同时使用任何数量的附加库或组件,只要遵守上述关于线程安全的准则,它们本身就可以使用ØMQ。

2、消息

  ØMQ消息是在同一应用程序的应用程序或组件之间传递的一个独立的数据单元。ØMQ消息没有内部结构,从ØMQ本身来看,它们被认为是不透明的二进制数据。

  提供以下功能来处理消息:

  初始化消息:zmq_msg_init(3)zmq_msg_init_size(3)zmq_msg_init_data(3)
  发送和接收消息:zmq_msg_send(3)zmq_msg_recv(3)
  关闭消息:zmq_msg_close(3)
  访问消息内容:zmq_msg_data(3)zmq_msg_size(3)zmq_msg_more(3)
  使用消息属性:zmq_msg_gets(3)zmq_msg_get(3)zmq_msg_set(3)
  消息操作:zmq_msg_copy(3)zmq_msg_move(3)

3、套接字

  ØMQ套接字提供异步消息队列的抽象,具体取决于正在使用的套接字类型。 有关所提供的套接字类型,请参阅zmq_socket(3)。

  提供以下函数来处理套接字:

  创建一个套接字:zmq_socket(3)
  关闭一个套接字:zmq_close(3)
  操作socket选项:zmq_getsockopt(3)zmq_setsockopt(3)
  建立消息流:zmq_bind(3)zmq_connect(3)
  发送和接收消息:zmq_msg_send(3)zmq_msg_recv(3)zmq_send(3)zmq_recv(3)zmq_send_const(3)
  监视套接字事件:zmq_socket_monitor(3)

3.1、 输入/输出复用

  ØMQ为应用程序提供了一种机制,用于将输入/输出事件复用到包含ØMQ套接字和标准套接字的集合中。 该机制镜像标准的poll()系统调用,并在zmq_poll(3)中详细介绍。

4、消息传输

  ØMQ套接字可以使用多种不同的底层传输机制。 每种运输机制都适用于特定目的,并具有其自身的优点和缺点。

  提供以下传输机制:

  使用TCP的单播传输:zmq_tcp(7)
  使用PGM的可靠组播传输:zmq_pgm(7)
  本地进程间通信传输:zmq_ipc(7)
  本地进程内(线程间)通信传输:zmq_inproc(7)

5、代理

  ØMQ提供代理来创建扇出和扇入式拓扑。代理将前端套接字连接到后端套接字,并且不透明地切换两个套接字之间的所有消息。 代理可以选择性地捕获所有流量到第三个套接字。 要在应用程序线程中启动代理,请使用zmq_proxy(3)。

6、安全

  ØMQ套接字可以选择一种安全机制。 两个同伴必须使用相同的安全机制。

  为IPC和TCP连接提供以下安全机制:

  无安全性:zmq_null(7)
  使用用户名和密码进行纯文本身份验证:zmq_plain(7)
  椭圆曲线认证和加密:zmq_curve(7)
  以铠装文本格式生成CURVE密钥对:zmq_curve_keypair(3)
  将装甲钥匙转换为32字节的二进制密钥:zmq_z85_decode(3)
  将32字节二进制CURVE键转换为装甲文本字符串:zmq_z85_encode(3)

7、错误处理

  ØMQ库函数使用POSIX系统上的标准约定来处理错误。

  通常,这意味着一旦失败,一个ØMQ库函数将返回一个NULL值(如果返回一个指针)或一个负值(如果返回一个整数),并且实际的错误代码应该存储在errno变量中。

  提供zmq_errno()函数来协助处理这些情况; 有关详细信息,请参阅zmq_errno(3)。

  zmq_strerror()函数用于将ØMQ特定的错误代码转换为错误消息字符串; 有关详细信息,请参阅zmq_strerror(3)。

ZeroMQ API(一) 总序的更多相关文章

  1. ZeroMQ API(三) 消息

    1.初始化消息 1.1 zmq_msg_init(3) 1.1.1 名称 zmq_msg_init - 初始化空的ZMQ消息 1.1.2 概要 int zmq_msg_init(zmq_msg_t * ...

  2. ZeroMQ API(七) 安全

    1.无安全性:zmq_null(7) 1.1 名称 zmq_null - 没有安全性或机密性 1.2 概要 NULL机制由ZMTP 3.0规范定义:http://rfc.zeromq.org/spec ...

  3. ZeroMQ API(五) 传输模式

    1.使用TCP的单播传输:zmq_tcp(7) 1.1 名称 zmq_tcp - 使用TCP的ZMQ单播传输 1.2 概要 TCP是一种无处不在,可靠的单播传输.当通过具有ZMQ的网络连接分布式应用程 ...

  4. ZeroMQ API(四) 套接字

    1.创建一个套接字 1.1 zmq_socket(3) 1.1.1 名称 zmq_socket - 创建ZMQ套接字 1.1.2 概要 void * zmq_socket(void * context ...

  5. ZeroMQ API(二) 上下文

    1.创建上下文 1.1 zmq_ctx_new(3) 1.1.1 名称 zmq_ctx_new - 创建新的ZMQ上下文 1.1.2 概要 void * zmq_ctx_new(); 1.1.3 描述 ...

  6. ZeroMQ API(八) 异常&属性

    1.错误处理 1.1 zmq_errno() 1.1.1 名称 zmq_errno - 为调用线程检索errno的值 1.1.2 概要 int zmq_errno(void); 1.1.3 描述 zm ...

  7. ZeroMQ API(六) 代理

    1.zmq_proxy(3) 1.1 名称 zmq_proxy - 开始内置ZMQ代理 1.2 概要 int zmq_proxy(const void * frontend,const void * ...

  8. ZeroMQ接口函数之 :zmq - 0MQ 轻量级消息传输内核

    官方网址:http://api.zeromq.org/4-0:zmq zmq(7) 0MQ Manual - 0MQ/3.2.5 Name zmq – ØMQ 轻量级消息传输内核 Synopsis # ...

  9. ZeroMQ接口函数之 :zmq_bind - 绑定一个socket

    ZeroMQ 官方地址 : http://api.zeromq.org/4-0:zmq-bind zmq_bind(3) ZMQ Manual - ZMQ/3.2.5 Name zmq_bind -  ...

随机推荐

  1. PHP面试题一

    http://www.viphper.com/?p=28 1.用PHP打印出前一天的时间格式是2006-5-10 22:21:21(2分) $a = date("Y-m-d H:i:s&qu ...

  2. 笔记:EF出现列名 'Discriminator' 无效、类没有加入数据库上下文也被数据迁移生成表

    笔记: EF出现列名 'Discriminator' 无效: 类没有加入数据库上下文也被数据迁移生成表: 出现该问题一般是使用了某个基类继承了实体类: 原因是code first的POCO实体对象的继 ...

  3. 6/10 sprint2 看板和燃尽图的更新

  4. [转帖]常见USB种类

    随着 USB Type-C 接口被苹果推上热门话题,那么对于我们普通的消费者来说,各种 USB 接口类型我们知道多少?买一个设备回来我们是否会遇到各种接口各种线用不了的情况呢? 那么我们泪雪网新开的一 ...

  5. 工作中常用到的Linux命令

    ps: (ps的参数分成basic, list, output, thread, miscellaneous) (basic) -e / -A 显示所有进程 (output) -o 输出指定字段 ls ...

  6. app流畅度测试--使用手机自带功能

    1.进入开发者选项,在“监控”选项卡找到“GPU呈现模式分析”的选项 2.开启后,即可以条形图和线形图的方式显示系统的界面相应速度 3.那么要如何根据曲线判断系统是否流畅呢?实际上这个曲线表达的是GP ...

  7. 【uoj#213】[UNR #1]争夺圣杯 单调栈+差分

    题目描述 给出一个长度为 $n$ 的序列,对于 $1\sim n$ 的每一个数 $i$ ,求这个序列所有长度为 $i$ 的子区间的最大值之和,输出每一个 $i$ 的答案模 $998244353$ 后异 ...

  8. easyui布局隐藏伸缩按钮

    1. 在html中加入 <script> /** * layout方法扩展 * @param {Object} jq * @param {Object} region */ $.exten ...

  9. Python内部类,内部类调用外部类属性,方法

    一 Python中内部类 典型定义: class MyOuter: age=18 def __init__(self,name): self.name=name class MyInner: def ...

  10. MT【159】单调有界有极限

    已知数列$\{a_n\}$满足:$a_n>0,a_{n+1}+\dfrac{1}{a_n}<2,n\in N^*$.求证:(1)$a_{n+2}<a_{n+1}<2 (n\in ...