Socket types

Thread safety: ZeroMQ的socket是非线程安全的,并且ZeroMQ本身不建议在多个线程中传递同一个Socket,即使保证了线程同步。

 

Socket types: ZeroMQ一共具有12种类型的socket,5种消息模式。

  • 请求/应答模式:ZMQ_REQ、ZMQ_REP、ZMQ_DEALER、ZMQ_ROUTER
  • 发布/订阅模式:ZMQ_PUB、ZMQ_SUB、ZMQ_XPUB、ZMQ_XSUB
  • 管道模式:ZMQ_PUSH、ZMQ_PULL
  • 配对模式:ZMQ_PAIR
  • 本地模式:ZMQ_STREAM

目前只用到前两种模式,此文档暂时只阐述前两种。

请求/应答模式

ZMQ_REQ

    一般用于客户端发送请求消息,此类型的socket必须严格遵循先发送后接收的顺序,即:

    如果发生异常或者当前没有可用的服务(连接),socket会阻塞,直到有可用的服务(新连接到来),再把消息发送出去。REQ类型的socket不会丢弃消息。

    ZMQ_REP发送消息时会自动在消息顶部插入一个空帧。

 

特点总结:

  • 可兼容的Socket types:    ZMQ_REP, ZMQ_ROUTER
  • 数据传输:             双向
  • 发送/接收模式:        发送à接收à发送…
  • 发送路由策略:        Round-robin(循环队列)
  • 接收路由策略:        Last peer
  • 进入mute状态后:        阻塞

ZMQ_REP

    一般用于服务端接收消息,此类型的socket必须严格遵循先接收后发送的顺序,即:

    从客户端接收请求消息使用了公平队列,回应客户端时,所有的reply都会被路由到最后下达请求的客户端。

    如果发生异常或者当前没有可用的客户端连接,所有消息都会毫无提示的被丢弃,不会发生阻塞。

    

特点总结:

  • 可兼容的Socket types:    ZMQ_REQ, ZMQ_DEALER
  • 数据传输:             双向
  • 发送/接收模式:        接收à发送à接收…
  • 发送路由策略:        Last peer
  • 接收路由策略:        Fair-queued(公平队列)

ZMQ_DEALER

    DEALER是一种用于请求/答应模式的更高级的扩展Socket,它可以自由的收发消息,没有ZMQ_REP/ZMQ_REQ那样的限制。

    对于每一个连接,接收消息也是使用了公平队列,发送使用了循环队列(RR)。

    ZMQ_DEALER受ZMQ_RCVHWZMQ_SNDHW两个阀值影响(可通过zmq_setsockopt函数设置),一旦发送或接收队列达到阀值,Socket就会进入mute状态,此时对DEALER的任何zmq_send操作都会阻塞,直到mute状态结束。

如果当前没有有效的连接,zmq_send操作也会阻塞,直到有新的连接到来为止。

    DEALER发生阻塞并不会丢弃消息。

注意:如果ZMQ_DEALER连接到ZMQ_REP,每一个消息包必须包含一个空帧,然后再紧跟着数据包体。

 

特点总结:

  • 可兼容的Socket types:    ZMQ_ROUTER, ZMQ_REP, ZMQ_DEALER
  • 数据传输:             双向
  • 发送/接收模式:        无限制
  • 发送路由策略:        Round-robin(循环队列)
  • 接收路由策略:        Fair-queued(公平队列)
  • 进入mute状态后:        阻塞

ZMQ_ROUTER

ZMQ_ROUTER是一种用于请求/答应模式的更高级的扩展Socket,它可以自由的收发消息。

当ZMQ_ROUTER接收到消息时,会自动在消息顶部加入来源地址标识符,接收消息使用了公平队列。当发送消息时,ZMQ_ROUTER又会自动去掉这个标识符,并且根据这个标识符路由到相应的端点。

如果此地址标识的端点不存在,默认会毫无征兆的丢弃消息,除非将ZMQ_ROUTER_MANDATORY
选项设置为1。

当队列达到阀值时,Socket就会进入mute状态,此时所有后续发送到此Socket的消息都会被丢弃,直到mute状态结束。同样的,如果对端的接收队列达到了阀值,消息也会被丢弃。

如果ZMQ_REQ连接到ZMQ_ROUTER,从ZMQ_ROUTER接收到ZMQ_REQ的消息时,除了会在消息前加上来源地址标识符之外,还会加上一个空帧与原消息分隔,即:

因此消息可以包含多个地址标识符和多个数据包体,如:

            

地址和数据体之间必须用空帧分隔;

发送回应消息给ZMQ_REQ时,必须至少包含一个空帧;

发送消息时,ZMQ_ROUTER会根据第一个地址标识符路由到对应的端点;

    

特点总结:

  • 可兼容的Socket types:    ZMQ_DEALER, ZMQ_REQ, ZMQ_ROUTER
  • 数据传输:             双向
  • 发送/接收模式:        无限制
  • 接收路由策略:        Fair-queued(公平队列)
  • 进入mute状态后:        丢弃消息

发布/订阅模式

ZMQ_PUB

ZMQ_PUB类型的Socket以发布者的身份向订阅者分发消息,消息以扇出的形式发送给所有订阅者连接。

ZMQ_PUB类型的Socket没有实现zmq_recv函数,所以不能对其调用zmq_recv函数!

当ZMQ_PUB Socket达到阀值时进入mute状态,此时后续发送的消息会被丢弃,知道mute状态结束。

对ZMQ_PUB Socket调用zmq_send永远不会发生阻塞。

 

特点总结:

  • 可兼容的Socket types:    ZMQ_SUB, ZMQ_XSUB
  • 数据传输:             单向
  • 发送/接收模式:        只能发送
  • 接收路由策略:        Fan out(扇出)
  • 进入mute状态后:        丢弃消息

 

ZMQ_SUB

    ZMQ_SUB类型的Socket以订阅者的身份接收消息。初始的ZMQ_SUB Socket没有订阅任何消息,可以通过设置ZMQ_SUBSRIBE选项来指定需要订阅的消息。

    ZMQ_SUB Socket没有实现zmq_send函数,所以不能对其调用zmq_send函数!

    特点总结:

  • 可兼容的Socket types:    ZMQ_PUB, ZMQ_XPUB
  • 数据传输:             单向
  • 发送/接收模式:        只能接收
  • 接收路由策略:        Fair-queued(公平队列)

Socket options(部分)

概要:通过zmq_setsockopt和zmq_getsockopt函数来设置/读取指定选项。

ZMQ_SNDHWM

设置指定Socket的发送消息队列的高水位标识(阀值),ZMQ会严格限制发送队列的上限数。0表示无限制。

如果达到了这个限制,socket就会进入异常状态,ZMQ此时会采取适当的措施——阻塞或丢弃消息,这取决于socket的类型。

Note: ZMQ不保证socket一定能接受ZMQ_SNDHWM这么多的消息,甚至可能会低60%-70%,这取决于socket上的信息流。

 

  • Option value type:         int
  • Option value uint:         message
  • Default value:             1000
  • Applicable socket types:     all

ZMQ_RCVHWM

设置指定Socket的接受消息队列的高水位标识(阀值),ZMQ会严格限制接受队列的上限数。0表示无限制。

如果达到了这个限制,socket就会进入异常状态,ZMQ此时会采取适当的措施——阻塞或丢弃消息,这取决于socket的类型。

 

  • Option value type:         int
  • Option value uint:         message
  • Default value:             1000
  • Applicable socket types:     all

ZMQ_SUBSCRIBE

    ZMQ_SUBSCRIBE选项会在ZMQ_SUB Socket上建立一个消息过滤器。初始的ZMQ_SUB Socket会过滤掉所有的消息,因此必须设置这个选项,否则将收不到任何消息。

    如果设置一个0长度(option_value)的空值(option_value),ZMQ_SUB Socket会接受所有的消息。设置一个非空值将接受指定的消息。可以在同一个ZMQ_SUB Socket上设置多个过滤器,它将会接受至少一个匹配的消息。

 

  • Option value type:         binary data
  • Option value uint:         N/A
  • Default value:             N/A
  • Applicable socket types:     ZMQ_SUB

ZMQ_UNSUBSCRIBE

    此选项用来删除ZMQ_SUB Socket上通过ZMQ_SUBSCRIBE设置过的消息过滤器。如果Socket有多个实例有相同的过滤器,只删除其中一个。

 

  • Option value type:         binary data
  • Option value uint:         N/A
  • Default value:             N/A
  • Applicable socket types:     ZMQ_SUB

ZMQ_IDENTITY

    此选项用来设置Socket的身份标识,只能用于请求/答应模式。ROUTER Socket可以根据这个身份标识来路由信息。

    身份标识的长度规定在1-255 bytes. 由二进制零开头的标识符为ZMQ保留使用。

    如果两个身份标识相同的Socket连接到同一个对端(ROUTER),结果行为是未定义的。

 

  • Option value type:         binary data
  • Option value uint:         N/A
  • Default value:             NULL
  • Applicable socket types:    ZMQ_REQ, ZMQ_REP, ZMQ_ROUTER, ZMQ_DEALER

ZMQ_RCVTIMEO

    设置Socket的receive操作的超时。

如果为0,则zmq_recv会立即返回,如果没有接收到消息,会返回一个EAGAIN错误;

如果为-1,Socket会阻塞到有可用消息为止;

如果为其他值,Socket要么阻塞达到指定的时间还没接收到可用的消息,返回一个EAGAIN错误,要么在指定时间前接收到可用消息。

 

  • Option value type:         int
  • Option value uint:         milliseconds
  • Default value:             -1(infinite)
  • Applicable socket types:    all

ZMQ_SNDTIMEO

    设置Socket的Send操作的超时。

    如果为0,则zmq_send会立即返回,如果消息没有发送成功,会返回一个EAGAIN错误;

    如果为-1,Socket会一直阻塞到消息消息发送完毕;

    如果为其他值,Socket要么阻塞达到指定的时间还没发送完成,返回一个EAGAIN错误,要么在指定时间前发送完消息。

 

  • Option value type:         int
  • Option value uint:         milliseconds
  • Default value:             -1(infinite)
  • Applicable socket types:    all

ZeroMQ总结的更多相关文章

  1. 消息队列性能对比——ActiveMQ、RabbitMQ与ZeroMQ(译文)

    Dissecting Message Queues 概述: 我花了一些时间解剖各种库执行分布式消息.在这个分析中,我看了几个不同的方面,包括API特性,易于部署和维护,以及性能质量..消息队列已经被分 ...

  2. ZeroMQ:云时代极速消息通信库

    ZeroMQ:云时代极速消息通信库(大规模|可扩展|低成本|高效率解决之道,大规模分布式|多线程应用程序|消息传递架构构建利器) [美]Pieter Hintjens(皮特.亨特金斯)著   卢涛 李 ...

  3. 以ZeroMQ谈消息中间件的设计【译文】

    本文主要是探究学习比较流行的一款消息层是如何设计与实现的 ØMQ是一种消息传递系统,或者乐意的话可以称它为"面向消息的中间件".它在金融服务,游戏开发,嵌入式系统,学术研究和航空航 ...

  4. NetMQ(一):zeromq简介

    ZeroMQ系列 之NetMQ 一:zeromq简介 二:NetMQ 请求响应模式 Request-Reply 三:NetMQ 发布订阅模式 Publisher-Subscriber 四:NetMQ ...

  5. zeromq系列

    ZeroMQ系列 之NetMQ 一:zeromq简介 二:NetMQ 请求响应模式 Request-Reply 三:NetMQ 发布订阅模式 Publisher-Subscriber 四:NetMQ ...

  6. 消息队列之ZeroMQ(C++)

    ZMQ是什么? 这是个类似于Socket的一系列接口,他跟Socket的区别是:普通 的socket是端到端的(1:1的关系),而ZMQ却是可以N:M 的关系,人们对BSD套接字的了解较多的是点对点的 ...

  7. ZeroMQ(ZMQ)函数接口英汉直译

    找了好多地方都找不到ZMQ接口函数的中文文档,就厚着脸皮自己翻译了下.但因为作者本人涉世未深,翻译有错误的地方还请大家不吝赐教,在下感激不尽. 因为时间有限,只能一点一点翻译了. ZMQ接口文档的官方 ...

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

  10. ZeroMQ接口函数之 :zmq_close - 关闭ZMQ socket

    ZeroMQ 官方地址 :http://api.zeromq.org/4-0:zmq_close zmq_close(3) ØMQ Manual - ØMQ/3.2.5 Name zmq_close  ...

随机推荐

  1. BZOJ.2741.[FOTILE模拟赛]L(分块 可持久化Trie)

    题目链接 首先记\(sum\)为前缀异或和,那么区间\(s[l,r]=sum[l-1]^{\wedge}sum[r]\).即一个区间异或和可以转为求两个数的异或和. 那么对\([l,r]\)的询问即求 ...

  2. [国家集训队]Crash的数字表格

    Description: 求$ \sum_{i=1}^n \sum_{j=1}^m lcm(i,j) $ Hint: $ n,m<=10^7 $ Solution: 这题有每次询问 \(O(n) ...

  3. iOS 跳转到系统指定设置界面

    在需要调转的按钮动作中添加如下的代码,就会跳转到设置中自己的app的设置界面,这里会有通知和位置权限的设置 NSURL * url = [NSURLURLWithString:UIApplicatio ...

  4. windows Server 2008 R2的安装

    1.http://msdn.itellyou.cn/ 在此下载IOS文件. 2.通过Nero进行刻录系统光盘,可以通过Daemon直接加载IOS,然后复制就可以了. 3.通过开机 Delete键进BI ...

  5. [Android Pro] AndroidX了解一下

    cp : https://blog.csdn.net/qq_17766199/article/details/81433706 1.说明 官方原文如下: We hope the division be ...

  6. Windows如何安装pip

    下载这个文件:  https://bootstrap.pypa.io/get-pip.py 然后到下载目录执行Python命令:   (管理员权限执行) python get-pip.py

  7. 4种事务的隔离级别,InnoDB怎样巧妙实现?

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/z50L2O08e2u4afToR9A/article/details/82186189 事务ACID ...

  8. 职场之KPI

    当一个公司开始执行KPI考核的时候,任何人的工作性质就发生了变化,而处于底层的员工就惨了,因为一个公司的资源是有限的,一个人的精力也是有限的,当你和你上司负责不同的项目时,而当你的所谓产品经理负责两个 ...

  9. nodejs sass安装报错一招解决

    背景: 这个问题不是一天两天了,有时候是网速不行,有时候是被墙了,有时候是github把node-sass的包转移目录导致下载失败. Cannot download "https://git ...

  10. 天猫魔盒1代TMB100E刷机, 以及右声道无声的问题

    这个是在小米盒子1代之后买的, 当时速度比小米盒子快, 除了遥控器比较软, 电池盖不太对得齐以外, 用起来还不错. 但是时间长了之后总是不停自己升级, 自己安装一些应用, 还删不了, 要知道这个盒子的 ...