(转)ZeroMQ简介
通讯socket语言apijms编程
★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 是非常值得大伙儿去尝试的一个网络通讯库。即使工作中用不到,业余时间玩玩也是不错滴。
分享到:
相关推荐
消息队列zeromq的go语言测试实例包,为学习安装部署zeromq的同学提供,注意该安装包中的测试实例为go语言版本,要根据各位安装的zeromq版本下载。
zeromq是一个强大的开源消息队列系统,它提供了一种高效、灵活且可扩展的通信框架,用于构建分布式应用程序。消息队列在软件开发中扮演着重要的角色,它允许不同进程或服务之间异步传递消息,提高了系统的并行性和...
zeromq库是一个高效的消息队列系统,常用于构建分布式应用程序。它的设计目标是提供一个简单易用、高性能且可移植的接口,使得开发者能够轻松地实现进程间通信(IPC)和网络通信。zeromq提供了多种编程语言的API,...
zeromq(ZeroMQ)是一个开源的消息中间件,它提供了高级消息队列的功能,可以实现进程间通信(IPC)和网络间通信(IPC),支持多种协议,如TCP、UDP、PGM以及PUB/SUB、REQ/REP、DEALER/ROUTER等多种消息模式。zeromq...
ZeroMQ(有时也被称作0MQ或 ØMQ)是一种高级的分布式应用程序框架,它为开发人员提供了高效、灵活的消息队列机制,旨在解决分布式计算环境下的消息传递问题。ZeroMQ的设计理念是简单易用,并且支持多种编程语言,...
2. **消息队列的类型**:常见的消息队列有RabbitMQ、Kafka、ActiveMQ、ZeroMQ等。这些消息队列各有特点,例如RabbitMQ支持多种协议,Kafka擅长大数据流处理,而ZeroMQ则提供了轻量级的解决方案。 3. **消息模型**:...
ZeroMQ,又称为0MQ或ØMQ,是一个高度可扩展的、高性能的开源消息队列系统,它在设计上借鉴了传统的消息中间件概念,但更注重轻量级和灵活性。这个库允许开发者构建分布式应用,通过在进程间传递消息来实现异步通信...
零MQ(ZeroMQ)是一种高性能、轻量级的消息队列系统,它被广泛应用于分布式计算环境中,用于在不同进程间高效地传输数据。ZeroMQ不仅仅是一个消息队列,它更像一个网络通信框架,提供了多种高级通信模式,如发布/...
此外,还可以使用ZeroMQ,这是一个轻量级的库,提供了一套消息队列的接口,可以在C和C++中直接使用。 在压缩包中的“C,C++源码”可能包含了实现消息队列的示例代码或者使用这些库的教程。通过这些源码,你可以学习...
主流的分布式消息队列如ZeroMQ、RabbitMQ等,实现了对AMQP协议的支持。分布式消息队列不仅需要满足基本的分布式和队列特性,还需关注基本消息模型、功能和性能、接口封装度、可靠性和扩展性等关键需求指标。 综上所...
### 消息队列的理解与应用 #### 一、什么是消息队列? 消息队列是一种在消息的传输过程中用于保存消息的容器。这里的“消息”指的是在两台计算机之间传送的数据单元,它可以是非常简单的文本字符串,也可以是包含...
在我们的系统中,ZeroMQ可以作为消息队列内部通信的一种补充,例如,当消息需要跨进程传输或者与其他系统交互时,zmq可以提供低延迟、高效率的解决方案。 五、配置文件(para.ini) para.ini文件通常用于存储系统...
消息队列在IT行业中是一种非常重要的中间件技术,主要用于解耦系统组件,提供异步通信的能力,以及提高系统的处理能力和可扩展性。在本话题中,我们将深入探讨消息队列的实现,特别是与VC(Visual C++)相关的实现...
在实际生产环境中,常见的消息队列中间件有ActiveMQ、RabbitMQ、ZeroMQ、Kafka、MetaMQ和RocketMQ等。 **消息队列工作原理** 消息队列通常包含三个角色:队列服务端、消息生产者和消息消费者。服务端负责接收和...
在C++和Linux环境下,我们可以使用多种库来实现消息队列,例如POSIX消息队列、ZeroMQ、RabbitMQ、Apache Kafka等。下面我们将深入探讨这些知识点: 1. **POSIX消息队列**: 这是Linux内核提供的一种原生机制,允许...
消息队列zeromq的C#移植版本netmq,请求响应模式的例子,netmq版本是3.3.3.1 ,.net版本是net45 <package id="NetMQ" version="3.3.3.1" targetFramework="net45" />
本文来自于网络,文章详细介绍了目前主流的消息队列ZeroMQ及环境搭建的详细步骤,希望文章的介绍可以让大家有个新的认识。想开发高并发可扩展的互联网架构,消息队列是不可缺少的,目前主流的消息队列,有windows...
在Linux环境中,ZeroMQ通过消息队列机制实现了进程间的通信,使得数据可以在不同程序之间安全、有序地传输。这个版本的压缩包文件名后缀是 ".tar.gz",表明这是一个经过GNU tar工具压缩的归档文件,通常用于在Unix-...
SaltStack 本身是基于 Python 语言开发实现,结合了轻量级的消息队列软件 ZeroMQ 与 Python 第三方模块(Pyzmq、PyCrypto、Pyjinjia2、python-msgpack 和 PyYAML 等)构建。 SaltStack 的基本概念与工作机制...