ZeroMQ全面介绍
★ZMQ是啥玩意儿?
通俗地说,ZMQ是一个开源的、跨语言的、非常简洁的、非常高性能、非常灵活的网络通讯库。
它的官方网站在"这里",维基百科的介绍在"这里"(暂时没有中文的维基词条)。
这玩意儿推出的时间不长,貌似09年下半年才推出1.0.1版本。俺去年开始接触它,感觉实在不错,今年就已经用于公司的产品中。最近一段时间,对 ZMQ 的好评日渐增多,所以俺也来赶赶潮流,在俺博客里忽悠一下。
接下来,就针对ZMQ的几大特点,分别聊一聊。
★简单
ZMQ的首要特点,就是简单(从它的名字也能感觉得到)。
◇封装导致的简单
相比原始的 socket API,ZMQ 封装掉了很多东西,免去了开发人员的很多麻烦。
比如,传统的 TCP 是基于字节流进行收发,因此程序猿常常要自己去处理数据块与数据块之间的边界(断界处理);与之相对,ZMQ 是以消息为单位进行收发,它确保你每次发出/收到的,都是一个消息块。这样一来,就省却了不少代码量。
比如,基于 socket API 进行 TCP 通讯,你需要自己处理很多网络异常(比如连接异常中断以及重连),即使有经验的程序员,也未必能写得严密。而在 ZMQ 中,这些琐事统统不用程序猿操心。
再比如,用传统的 socket API,当你想提高通讯性能,往往要搞些异步(非阻塞)、缓冲区、多线程之类的把戏。而这些东西,ZMQ 也帮你封装掉了。
总而言之,ZMQ 对很多底层细节的封装,让你的网络程序代码变得简单,写起来又快又轻松。
◇API的简单
ZMQ 的 API 接口很少,而且在风格上非常类似于 BSD Socket。如果你曾经用 socket API 写过程序,那要上手 ZMQ 是非常容易的。如果你是 Java 程序猿,搞过 JMS API(比如 ActiveMQ),那你会发觉两者的 API 简直是天壤之别。顺便抱怨一下:Java 的 JMS API,那可真是复杂啊!
◇具体的示例
为了增加说服力,下面给出 Python 语言实现的 Echo Server 代码(所谓的Echo Server,是一种最简单的服务端程序。它把收到的信息原样回送给客户端程序)。
#服务端程序
import zmq
context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind("tcp://127.0.0.1:1234")
while True :
msg = socket.recv()
socket.send(msg)
#客户端端程序
import zmq
context = zmq.Context()
socket = context.socket(zmq.REQ)
socket.connect("tcp://127.0.0.1:1234")
msg_send = "xxx"socket.send(msg_send)
print "Send:", msg_send
msg_recv = socket.recv()
print "Receive:", msg_recv
从上述示例代码,大伙儿应该能感觉到:ZMQ 的使用,是非常简单的。
★灵活
所谓的灵活性,主要指如下2方面。
◇适用于多种通讯环境
ZMQ 可以灵活地支持多种通讯环境(进程内,主机内跨进程、跨主机)。ZMQ 的 API 设计得很好,以至于你的代码只要做很小的改动(甚至不改动),就可以适用于不同的通讯环境。
在刚才的例子里,有这样的语句 socket.connect("tcp://127.0.0.1:1234")。其中的 "tcp://127.0.0.1:1234" 是表示通讯对端的地址串。ZMQ 约定地址串使用如下格式:transport://endpoint 。地址串前面的 transport 表示通讯的类型,目前支持 inproc(进程内),ipc(主机内跨进程),tcp(跨主机),pgm(跨主机,支持多播)共4种方式。
对程序猿来说,如果你把通讯的地址串保存到配置文件中,就完全可以用一套代码来搞定多种通讯方式,非常爽!
◇支持多种通讯模式
ZMQ将常见的通讯场景进行了归纳,总结了如下几种不同的模式。
PUB and SUB
REQ and REP
REQ and ROUTER
DEALER and REP
DEALER and ROUTER
DEALER and DEALER
ROUTER and ROUTER
PUSH and PULL
PAIR and PAIR
限于篇幅,俺就不深入介绍每种模式了,有兴趣的同学请看官方文档(在"这里")。
★跨语言
为啥俺要强调跨语言的特色捏?通常来说,用得着网络通讯库的软件系统,某种程度上都算是分布式系统。如果开发的分布式系统比较复杂,要想用一种编程语言通吃,难度较大。因此,在稍微复杂的分布式系统中,采用多种编程语言是常有的事儿(至少俺的经历是如此)。所以,ZMQ 的这个跨语言特色就显得非常重要了。
在官方网站的文档中,给出了如下许多编程语言的示例(链接在"这里")。为避免引发编程语言的名次之争,以下按照字母序排列。
Ada, Basic, C#, C, C++, Common Lisp, Erlang, Go, Haskell, Haxe, Java, JavaScript(Node.js), Lua, Objective-C, PHP, Perl, Python, Racket, Ruby, Scala
这个语言清单太全了,居然有2个语言,俺都没听说过。可以不夸张地说——常用的编程语言,都可以找到相应的 ZMQ 封装库。
★高性能
说到性能,这可是 ZMQ 吹嘘的主要亮点。首先,ZMQ 是用 C/C++ 开发的(C/C++ 的性能,那可是公认滴);其次,ZMQ 本身的协议格式定义得很简洁(相对来说,JMS 规范中的协议格式就复杂多了)。所以,它的性能远远高于其它的消息队列软件。甚至可以说,用 ZMQ 的性能,跟用传统 socket API 的性能,是不相上下滴。
为了让大伙儿有一个感性的认识,俺特地找来了消息队列软件的性能测评。这是某老外写的一篇帖子(在"这里"),不懂洋文的同学可以看"这里"。连帖子都懒得看的同学,可以直接看下图。
从图中可以明显看出,ZMQ 相比其它几款MQ,简直是鹤立鸡群啊!性能根本不在一个档次嘛。
★总结
总体而言,ZMQ 是非常值得大伙儿去尝试的一个网络通讯库。即使工作中用不到,业余时间玩玩也是不错滴。
本帖子发出后,如果感兴趣的人较多,俺会根据反馈,再聊一些深入的话题。
转载于:https://www.cnblogs.com/mtcnn/archive/2011/10/22/9410136.html
ZeroMQ全面介绍相关推荐
- 一个网络传输框架——zeroMQ 调研笔记
一.它是什么 zeroMQ,一个处理消息传输的库,重点在传输上,看起来它像是在socket上面封装了一层,让我们可以很容易的利用它来做N对M的数据传输,在分布式系统中很方便,在接收端它有round-r ...
- [Ubuntu]Scrcpy+Zeromq实现手机屏幕yuv数据传输,并通过OpenCV实现连续播放——(二)(思路+代码解析)
Scrcpy在上一篇博客中有所介绍,并且使用Scrcpy实现了手机屏幕yuv数据的提取([Ubuntu]Scrcpy获取手机屏幕yuv数据_又是谁在卷的博客-CSDN博客).本文将介绍一个当下较为好用 ...
- C 程序员必须收藏的资源大全
C 资源大全列表 构建系统 下面是一些 C 项目的自动化构建和测试工具. aimake – 一个被设计来避免复杂配置的构建工具.GNU GPL3 或更高版本. Autoconf – 一个可扩展的 M4 ...
- 每个程序员都有的经历:从程序员到高级架构师,必须经历的三个阶段
程序员是我们国家一个庞大的群体,每个程序员.或者说每个工作者都应该有自己的职业规划,如果你不是富二代,不是官二代,也没有职业规划,希望你可以思考一下自己的将来.今天给大家分享的是一篇来自腾讯C/C++ ...
- 程序员到高级架构师,必须经历的三个阶段
摘要: 每个程序员.或者说每个工作者都应该有自己的职业规划,如果你不是富二代,不是官二代,也没有职业规划,希望你可以思考一下自己的将来. 每个程序员.或者说每个工作者都应该有自己的职业规划,如果你不是 ...
- C++ 程序员到高级架构师,必须经历的三个阶段
摘要: 每个程序员.或者说每个工作者都应该有自己的职业规划,如果你不是富二代,不是官二代,也没有职业规划,希望你可以思考一下自己的将来. 每个程序员.或者说每个工作者都应该有自己的职业规划,如果你不是 ...
- 一个c/c++分布式框架ZMQ或者ZeroMQ, 介绍和win下安装使用方法
ZMQ(ØMQ.ZeroMQ, 0MQ)看起来像是一套嵌入式的网络链接库,但工作起来更像是一个并发式的框架.它提供的套接字可以在多种协议中传输消息,如线程间.进程间.TCP.广播等.你可以使用套接字构 ...
- 消息队列技术介绍 : ActiveMQ、RabbitMQ、ZeroMQ、Kafka、MetaMQ、RocketMQ
一. 消息队列概述 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 消息队列中间件是分布式系统中重要的组件,主要解决应用耦合.异步消息.流量削锋等问 ...
- RabbitMQ,Apache的ActiveMQ,阿里RocketMQ,Kafka,ZeroMQ,MetaMQ,Redis也可实现消息队列,RabbitMQ的应用场景以及基本原理介绍,RabbitMQ
RabbitMQ,Apache的ActiveMQ,阿里RocketMQ,Kafka,ZeroMQ,MetaMQ,Redis也可实现消息队列,RabbitMQ的应用场景以及基本原理介绍,RabbitMQ ...
最新文章
- React-Native Navigator 过渡动画卡顿的解决方案
- 获取数据库中的所有表
- php遍历删除目录下文件,PHP遍历删除文件夹已经文件内的所有文件
- gradle中的build script详解
- 制作.bat文件快速启动Mongo服务
- 美国 AI 博士爆料:掌握这9个要点,赚钱不再艰难
- 解决Centos7 yum 出现could not retrieve mirrorlist 错误
- Linux 4.21优化Zen 2架构
- 专注SilverLight
- 拓客系统专用服务器,北京拓客系统
- 计算机服务重置,怎么重置电脑网络设置
- 计算机病毒学,计算机病毒学.doc
- 从初级开发给大龄架构师review代码来看慢慢人生路
- Halcon XLD 算子集合
- cf1677C. Tokitsukaze and Two Colorful Tapes(div1)
- BT源代码学习心得(二):程序运行参数的获取 -- 转贴自 wolfenstein (NeverSayNever)
- JSONArray转字符串数组
- 培训机构出来的程序员进不了大厂?
- [读书笔记]5个小技巧让你写出更好的JavaScript[图]
- 区块链底层平台FISCO BCOS的网络压缩功能如何?
热门文章
- 天池 在线编程 订单分配(回溯)
- HDFS依然是存储的王者
- LeetCode 248. 中心对称数 III(DFS/BFS)
- LeetCode 1060. 有序数组中的缺失元素(二分查找)
- LeetCode 1480. 一维数组的动态和(前缀和)
- 剑指Offer - 面试题4. 二维数组中的查找(双指针)
- LeetCode 312. 戳气球(DP,难)
- c语言(int)x 100,【单选题】下列语句执行后,变量a、c的值分别是( ) int x=182; 
int a,c;c=x/100;a=x%10;...
- oracle如何检查是否rac,Oracle RAC 状态检查
- 系统总结vue组件间通信、数据传递(父子组件,同级组件)