1、使用TCP的单播传输:zmq_tcp(7)

1.1 名称

  zmq_tcp - 使用TCP的ZMQ单播传输

1.2 概要

  TCP是一种无处不在,可靠的单播传输。当通过具有ZMQ的网络连接分布式应用程序时,使用TCP传输可能是您的首选。

1.3 解决

  ZMQ端点是一个由transport://后跟一个地址组成的字符串。 transport指定要使用的基础协议。该地址指定要连接的传输特定地址。

  对于TCP传输,传输是tcp,地址部分的含义如下定义。

1.3.1 将本地地址分配给套接字

  当使用带有tcp传输的zmq_bind()将套接字本地地址分配给套接字时,端点将被解释为一个接口,后跟一个冒号和要使用的TCP端口号。

  接口可以由以下任何一种指定:

    通配符*表示所有可用的接口。

    分配给接口的主要IPv4或IPv6地址,以其数字表示形式。

    操作系统定义的非可移植接口名称。

  TCP端口号可以通过以下方式指定:

    一个数值,通常在POSIX系统上超过1024。

    通配符*表示系统分配的临时端口。

  使用临时端口时,调用者应使用ZMQ_LAST_ENDPOINT套接字选项检索实际分配的端口。有关详细信息,请参阅zmq_getsockopt(3)。

1.3.2 从套接字解除通配符地址

  当在zmq_bind()中使用通配符*端点时,调用者应使用从ZMQ_LAST_ENDPOINT套接字选项中获得的实际endpoind使用zmq_unbind()从套接字解除绑定此端点。

1.3.3 连接一个socket

  当使用带tcp传输的zmq_connect()将套接字连接到对等地址时,端点应被解释为对等地址,后跟冒号和要使用的TCP端口号。您可以选择指定一个source_endpoint作为连接的源地址; tcp:// source_endpoint;'endpoint',详见上面的接口说明。

  对等地址可以由以下任一项指定:

    对等体的DNS名称。

    对等体的IPv4或IPv6地址,以其数字表示形式。

  注意:有关TCP传输使用的ZeroMQ消息传输协议(ZMTP)的说明可以在http://rfc.zeromq.org/spec:15找到

2、使用PGM的可靠组播传输:zmq_pgm(7)

2.1 名称

  zmq_pgm - 使用PGM的ZMQ可靠多播传输

2.2 概要

  PGM(Pragmatic General Multicast)是IP网络上可靠的数据组播传输协议。

2.3 描述

  ZMQ实现PGM的两种变体,PGM数据报直接在RFC 3208(pgm传输)和“封装PGM”或EPGM定义的IP数据报之上分层,其中PGM数据报封装在UDP数据报内(epgm传输)。

  pgm和epgm传输只能与ZMQ_PUB和ZMQ_SUB套接字类型一起使用。

  此外,PGM套接字默认是速率限制的。有关详细信息,请参阅zmq_setsockopt(3)中记录的ZMQ_RATE和ZMQ_RECOVERY_IVL选项。

  pgm传输实现需要访问原始IP套接字。在此操作的某些操作系统上可能需要额外的权限。鼓励不要求与其他PGM实现直接互操作的应用程序使用epgm传输,而不需要任何特殊权限。

2.4 解决

  ZMQ端点是一个由transport://后跟一个地址组成的字符串。 transport指定要使用的基础协议。 该地址指定要连接的传输特定地址。

  对于PGM运输,运输是pgm,而对于EPGM协议,运输是epgm。 地址部分的含义定义如下。

2.5 连接一个socket

  当使用带pgm或epgm传输的zmq_connect()将套接字连接到对等地址时,端点将被解释为一个接口,后跟一个分号,后跟一个多播地址,后跟一个冒号和一个端口号。

  接口可以由以下任何一种指定:

    操作系统定义的接口名称。

    以数字表示形式分配给接口的主IPv4地址。

  注:接口名称没有以任何方式标准化,应该被认为是任意的并且取决于平台。 在Win32平台上,不存在短接口名称,因此只有主IPv4地址可用于指定接口。 接口部分可以省略,在这种情况下,将会选择默认的接口部分。多播地址由其数字表示中的IPv4多播地址指定。

2.5 Wire格式

  连续的PGM数据报被ZMQ解释为单个连续的数据流,其中ZMQ消息不一定与PGM数据报边界对齐,并且单个ZMQ消息可以跨越几个PGM数据报。 这个数据流由zmq_tcp(7)中描述的封装在帧中的ZMQ消息组成。

2.5.1 Pgm数据报有效载荷

  以下ABNF语法表示由ZMQ使用的单个PGM数据报的有效负载:

  datagram = (offset data)
  offset = 2OCTET
  data = *OCTET

  为了延迟加入消费者能够识别消息边界,每个PGM数据报有效载荷以网络字节顺序中的16位无符号整数开始,指定数据报中第一个消息帧的偏移或者如果数据报包含值0xFFFF 仅包含较大消息的中间部分。

  请注意,偏移指定了第一条消息的开始位置,而不是第一条消息部分。 因此,如果在数据包的开头有尾随消息部分,则偏移将忽略它们并指向数据包中的第一个初始消息部分。

  下图说明了单个PGM数据报有效载荷的布局:

  +------------------+----------------------+
  | offset (16 bits) | data |
  +------------------+----------------------+

  下图进一步说明了三个示例ZMQ帧在连续的PGM数据报载荷中的布局:

  第一个数据报有效载荷
  +--------------+-------------+---------------------+
  | Frame offset | Frame 1 | Frame 2, part 1 |
  | 0x0000 | (Message 1) | (Message 2, part 1) |
  +--------------+-------------+---------------------+

  第二个数据报有效载荷
  +--------------+---------------------+
  | Frame offset | Frame 2, part 2 |
  | 0xFFFF | (Message 2, part 2) |
  +--------------+---------------------+

  第三数据报有效载荷
  +--------------+----------------------------+-------------+
  | Frame offset | Frame 2, final 8 bytes | Frame 3 |
  | 0x0008 | (Message 2, final 8 bytes) | (Message 3) |
  +--------------+----------------------------+-------------+

3、本地进程间通信传输:zmq_ipc(7)

3.1 名称

  zmq_ipc - ZMQ本地进程间通信传输

3.2 概要

  进程间传输使用依赖于系统的IPC机制在本地进程之间传递消息。

  注:进程间传输目前仅在提供UNIX域套接字的操作系统上实现。

3.3 解决

  ZMQ端点是一个由transport://后跟一个地址组成的字符串。 transport指定要使用的基础协议。

  该地址指定要连接的传输特定地址。对于进程间传输,传输是ipc,地址部分的含义在下面定义。

3.3.1 绑定一个套接字

  使用带有ipc传输的zmq_bind()将套接字绑定到本地地址时,端点应被解释为识别要创建的路径名的任意字符串。 路径名在ipc实现使用的操作系统名称空间内必须是唯一的,并且必须满足操作系统对路径名格式和长度的任何限制。

  当地址是*时,zmq_bind()应该生成一个唯一的临时路径名。 调用者应该使用ZMQ_LAST_ENDPOINT套接字选项来检索此路径名。 有关详细信息,请参阅zmq_getsockopt(3)。

    任何现有的绑定到同一端点都应被覆盖。 也就是说,如果第二个进程绑定到已经被进程绑定的端点,则这将成功,第一个进程将失去绑定。 在这种行为中,ipc传输与tcp或inproc传输不一致。

    该进程必须能够写入端点路径名。 当端点以/,例如,ipc:///路径名开始时,这将是绝对路径名。 如果端点指定了一个不存在的目录,绑定将失败。

    仅在Linux上,当端点路径名以@开头时,应使用抽象名称空间。 抽象名称空间独立于文件系统,如果一个进程试图绑定已经被进程绑定的端点,它将会失败。 有关详细信息,请参阅unix(7)。

    IPC路径名的最大大小取决于操作系统。 在Linux上,最多113个字符,包括“ipc://”前缀(真实路径名称为107个字符)。

3.3.2 从套接字解除通配符地址

  当在zmq_bind()中使用通配符*端点时,调用者应使用从ZMQ_LAST_ENDPOINT套接字选项中获得的实际endpoind使用zmq_unbind()从套接字解除绑定此端点。

3.3.3 连接一个套接字

  当使用带有ipc传输的zmq_connect()将套接字连接到对等地址时,端点应被解释为识别要连接的路径名的任意字符串。 路径名必须先在操作系统名称空间内创建,方法是将其分配给带有zmq_bind()的套接字。

4、本地进程内(线程间)通信传输:zmq_inproc(7)

4.1 名称

  zmq_inproc - ZMQ本地进程内(线程间)通信传输

4.2 概要

  进程内传输直接在共享单个ZMQ上下文的线程之间通过内存传递消息。

  注:使用inproc传输传递消息时不涉及I / O线程。 因此,如果您正在使用ZMQ上下文进行进程内消息传递,则只需使用零I / O线程即可初始化上下文。 有关详细信息,请参阅zmq_init(3)。

4.3 解决

  ZMQ端点是一个由transport://后跟一个地址组成的字符串。 transport指定要使用的基础协议。 该地址指定要连接的传输特定地址。

  对于进行中的运输,运输是不合理的,地址部分的含义在下面定义。

4.3.1 将本地地址分配给套接字

  当使用带inproc传输的zmq_bind()将本地地址分配给套接字时,端点应被解释为识别要创建的名称的任意字符串。 该名称在与套接字关联的ZMQ上下文中必须是唯一的,长度最多可达256个字符。 名称的格式没有其他限制。

4.3.2 连接一个套接字

  当使用带inproc传输的zmq_connect()将套接字连接到对等地址时,端点将被解释为识别要连接的名称的任意字符串。 该名称必须先通过将其分配给与所连接的套接字相同的ZMQ上下文中的至少一个套接字来创建。

5、集群IPC协议:zmq_tipc

5.1 名称

  zmq_tipc - 使用TIPC的ZMQ单播传输

5.2 概要

  TIPC是一种采用位置透明寻址方案的集群IPC协议。

5.3 解决

  ZMQ端点是一个由transport://后跟一个地址组成的字符串。 transport指定要使用的基础协议。 该地址指定要连接的传输特定地址。

  对于TIPC运输,运输是tipc,地址部分的含义如下定义。

5.3.1 将端口名称分配给套接字

  使用_zmq_bind()_与'tipc'分配端口名称给套接字时

  运输,'端点'的定义形式如下:
    {type,lower,upper}

    *类型是您的服务的数字(u32)ID。
    * Lower和Upper为您的服务指定一个范围。

    发布具有重叠的较低/较高ID的相同服务的意愿
    导致连接请求以循环方式分配到这些请求上方式。

5.3.2 连接一个套接字

  当使用带tipc传输的zmq_connect()将套接字连接到对等地址时,端点将被解释为服务ID,后跟逗号和实例ID。

  实例ID必须位于发布的端口名称的较低/较高范围内,以使端点有效。

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(一) 总序

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

  3. Web API <五> 序列化

    在 Asp.Net Web Api 中提供了两种 媒体类型格式化器(mime-type formatter),分别用于支持 JSON 和 XML 数据的格式化处理.默认两种格式化器已集成到了 Asp. ...

  4. Spring Boot 2.x 编写 RESTful API (五) 单元测试

    用Spring Boot编写RESTful API 学习笔记 概念 驱动模块 被测模块 桩模块 替代尚未开发完毕的子模块 替代对环境依赖较大的子模块 (例如数据访问层) 示例 测试 Service @ ...

  5. ZeroMQ API(七) 安全

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

  6. ZeroMQ API(四) 套接字

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

  7. 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 描述 ...

  8. 天气预报API(五):城市代码--“新编码”和“旧编码” 对比

    参考一些博客.文章 来查找 测试 接口,后来发现两套城市编码标准,有点想法,故拿来对比分析. 注:新旧编码是个人主观叫法,只是为了方便称呼,可能有不当之处,请留言更正. 暂且称 中国天气网等网站使用的 ...

  9. Selenium2(java)selenium常用API 五

    上传文件   元素标签是input时上传方式 上传是一个input,对于这种元素是input 的标签可以采用元素的sendKeys()方法来直接赋值,upload.html代码: <html&g ...

随机推荐

  1. Java第一天——环境变量的配置与破解myeclipse2013

    一.jdk环境变量的配置 1.下载JDK并安装(官网JavaSE,64位(具体看电脑是多少位的))官网http://www.oracle.com/technetwork/java/javase/dow ...

  2. raise PDFEncryptionError('Unknown algorithm: param=%r' % param) pdfminer.pdfdocument.PDFEncryptionError: Unknown algorithm

    使用pdfminer遇到的pdf文件加密问题: raise PDFEncryptionError('Unknown algorithm: param=%r' % param) pdfminer.pdf ...

  3. MapReduce编程之Map Join多种应用场景与使用

    Map Join 实现方式一:分布式缓存 ● 使用场景:一张表十分小.一张表很大. ● 用法: 在提交作业的时候先将小表文件放到该作业的DistributedCache中,然后从DistributeC ...

  4. Java中的设计模式之单例模式

    Java中的单例模式 设计模式是软件开发过程中经验的积累 一.单例模式 1.单例模式是一种常用的软件设计模式,通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控 ...

  5. Scrum Meeting Beta - 8

    Scrum Meeting Beta - 8 NewTeam 2017/12/7 地点:新主楼F座二楼 任务反馈 团队成员 完成任务 计划任务 安万贺 完成了博文详情的存储Issue #150Pull ...

  6. java 调用 oracle的function 和 procedure

    1.调用函数 CallableStatement cs=con.prepareCall("{?=call get_pname(?,?,?)}"); 第一个?表示返回的值,后面的?可 ...

  7. pygame学习笔记(3)——时间、事件、文字

    转载请注明:@小五义 http://www.cnblogs.com/xiaowuyi 1.运动速率    上节中,实现了一辆汽车在马路上由下到上行驶,并使用了pygame.time.delay(200 ...

  8. [转帖]HDD磁盘,非4K无以致远

    https://blog.csdn.net/swingwang/article/details/54880918 机械硬盘的未来要靠高容量作为依托,在财报中,希捷表示未来18个月内它们将推出14和16 ...

  9. d指针在Qt上的应用及实现(有图,很清楚)

    Qt为了使其动态库最大程度上实现二进制兼容,引入了d指针的概念.那么为什么d指针能实现二进制兼容呢?为了回答这个问题,首先弄清楚什么是二进制兼容?所谓二进制兼容动态库,指的是一个在老版本库下运行的程序 ...

  10. UVA11324_The Largest Clique

    极大团.即求一个最大点集,使得点集中的任意两个点u,v至少存在u->v,或者v->u的路径. 是这样做的,求出所有的联通分量,然后整个图就变成了无环图,把原来若干个点缩点,点权为分量的点数 ...