高效能网络开发库ZeroMQ

原创 2013年12月04日 22:38:51

◇封装导致的简单
  相比原始的 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,简直是鹤立鸡群啊!性能根本不在一个档次嘛。
版权声明:

相关文章推荐

面向企业级应用开发的综合性、高效能的HTML5电子表格控件——SpreadJs

SpreadJS是一个面向企业级应用开发的综合性、高效能的HTML5电子表格控件。SpreadJS有着强大的表单处理能力和电子表格功能。这些功能包括跨表单注释和计算,这样就能够充分利用多个表单上的数据...

《高效能程序员的修炼》读书笔记(三)——开发技术和从业习惯

开发: 1.代码是我们的敌人。如果你不得不写代码,你也必须从简洁开始(简单的东西才是最强大的) 2.代码已经告诉我们程序是怎样工作的,注释告诉我的是程序为什么这样工作(前提是代码够简洁) 3.不...

高效能远程会话管理工具-screen

导读 Linux是一个多用户多进程的操作系统,linux的远程操作我们常常使用是的ssh进行远程的。我们可以登录打开不通的终端,但是每一个终端都是一个环节变量。你是不是经常为一些长时间运行的任务而头疼...

高效能程序员的修炼札记:轻重缓急,了然于心

时间过的真快,转眼间五一三天假期就结束了,以前在苏州的时候,会放假7天左右,带着对亲人的思念奔走于苏州和洛阳。如今,想和父母见上一面,倒也变得容易得多了,这让我觉得幸福更加让人知足。本篇作为《高效能程...

高效能程序员的修炼札记:安全基础,保护用户数据

现如今,各种网站用户安全问题不断爆发,很多用户的密码被网站曝光出来,安全是互联网的一个老生常谈的话题,为什么用户的密码这么容易被破解呢,首先,作为我们开发者来说,我们要想尽办法提高用户数据的安全性,同...

<高效能程序员的修炼>读后感

不知道我是何时关注codinghorror这个网站的。可能是我开始想使用RSS的时候吧。在Google上搜索了关于一些程序员必读的RSS源,在知乎上也有相关的回答。等收集了一大堆后,发现了coding...

笔记:《高效能人士的七个习惯》第八章 习惯五 知彼解己——移情沟通的原则

1、若要用一句话归纳我在人际关系方面学到的一个最重要的原则,那就是:知彼解己——首先寻求去了解对方,然后再争取让对方了解自己。这一原则是进行有效人际交流的关键。 2、心灵世界自有其理,非理智所能企及...

高效能人士的七个习惯——习惯一:积极主动

我以前所理解积极主动是,做事的时候表现的非常积极,主动去做一些事情而不是等着领导分配任务才去开始。这是比较狭隘的一种理解。积极主动不仅仅指行事态度,还意味着人一定要为自己的人生负责。它强调的是:个人行...

笔记:《高效能人士的七个习惯》第四章 习惯二 以终为始——自我领导的原则

1、太多人成功后,反而感到空虚;得到名利之后,却发现牺牲了更可贵的东西。因此,我们务必盯紧真正重要的愿景,然后勇往直前坚持到底,使生活充满意义。 2、和内在力量相比,身外之物显得微不足道。——奥利弗...

《高效能人士的七个习惯》读书笔记(2)--积极主动

光勇哥那天听说我要介绍《高效能人士的七个习惯》, 和我说: 这个的确有点难度. 我也感觉到, 对于社会经验还不太丰富的我来说, 的确是一个不少的挑战, 但我必须把这个挑战看作一个机会, 一个与有经验的...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)