[架构] ZeroMQ 深度探索(一)

来源:互联网 发布:村招募淘宝报名入口 编辑:程序博客网 时间:2024/06/02 03:45


最初认识 ZeroMQ 是被它的名号所吸引,最近在一个高性能中间件的项目中用到了 ZeroMQ,对这个号称“史上最快的消息队列”有了更深层次的了解。如果我们仅仅把 ZeroMQ 看作是一个消息队列,那就完全搞错了,ZeroMQ 是一套智能传输层协议,它不仅为开发者提供了强大的开发包,还包含了一套很棒的通信协议的实现,更值得一提是,它对分布式系统开发有着相当独到的见解,绝对值得我们好好学习。ZeroMQ 的最终目标是加入 Linux 内核,目前 ZeroMQ 已经出现在 YUM 中,相信 ZeroMQ 的未来会越来越美好!

ZeroMQ 特点介绍

1、支持高并发的异步 Socket 框架
2、协议比 TCP 更快、适用于大型集群和分布式计算
3、提供多种消息传递机制,如 inproc/IPC/TCP/multicast 等
4、内置丰富的组合模式,可用于简化大型分步式计算架构
5、提供异步 I/O 模式,适用于可扩展的多核应用开发
6、拥有活跃的开发者社区提供技术支持,发展相当迅速
7、支持超过 30 种的编程语言,如 C/C++/Java/.NET/Python/PHP 等
8、良好的跨平台性,支持多种 OS,如 Linux/Windows/OS X 等
9、拥有 iMatix 公司的商业级别支持,却是完全免费的

ZeroMQ 设计哲学

综合来说,ZeroMQ 的设计哲学在于“权衡”两字,其实 ZeroMQ 的名字就体现了这一点。“Zero”表示从零开始,也就是从无到有;ZeroMQ 不提供现成的安装套件(比如broker),这也意味着使用者必须自己来构建需要的套件,这种做法各有利弊;“利”在于使用者可以自由的构造属于自己的分布式系统,而“弊”则在于门槛比较高,对于不熟悉编程的使用者来说就麻烦大了。不过,相比与通过功能迭代来实现复杂需求的方案来说,ZeroMQ 更倾向于从根本上解决问题,这也正体现了 ZeroMQ 创始人 Pieter Hintjens 的设计哲学。

ZeroMQ 面向用户

ZeroMQ 是为那些对大型分布式系统感兴趣的开发者们而生的!假如你熟悉 C 语言,那么使用 ZeroMQ 将是件非常享受的事情,因为 ZeroMQ 开发包中已经包含了非常丰富的 C 语言的使用范例,有经验的开发者可以快速入手。使用 ZeroMQ 可以为我们节省下大量的编码时间,当然在此之前,我们需要把 ZeroMQ 的基础知识和用法理解透彻,否则误用或者错用的话,后果将是“很严重”的!接下来,我们开始学习 ZeroMQ 的基础知识。

ZeroMQ 学前必读

ZeroMQ 究竟是什么?也许我们应该先“大肆吹嘘”一番,但这显然是毫无意义的,也不是我们技术人员的本色。简单来说,ZeroMQ 是一个更小、更快、更简单的智能传输层协议,它可以帮助我们简化原本非常复杂的事情,实际上,这也就是当初设计 ZeroMQ 时的初衷。

今天,我们的世界变得越来越复杂,我们使用的软件也在随着人类社会的变化而演变。可以预见到的是,未来的软件系统将会变得越来越庞大,就像人类的大脑一样,错综复杂;这个时候,我们必须得把问题分解开来,逐个击破,否则,软件最终只能变成可怕的巨兽,把一切都搞砸。分而治之,讲的就是这个道理,这也就是我们需要分布式系统的原因。

在分布式系统中,代码之间需要通信,此时我们就必须使用网络、协议、线程这些工具来实现;然而,现实情况是,即使我们已经拥有了这些工具,但实现起来仍然非常费功夫。目前业界可用的网络协议比较有限,比如 TCP/UDP/HTTP/Websocket 等;这些协议要么太复杂,要么太笨重,也许我们会抱怨道,难道没有其他的选择了吗?ZeroMQ 是否会是我们期待的答案?下面,让我们回到两个最基本的问题上,一是如何实现代码之间需要通信,二是如何让通信变得更简单高效。

ZeroMQ HelloWorld

接下来,我们先从一个最简单的例子,即 HelloWorld 项目讲起。这就是网络请求中最基本的“请求-响应”模式(Request-Reply),客户端往服务端发送“Hello”,服务端回应“World”,如图1-1。



以下是 HelloWorld 项目的服务端代码(hwserver.c),熟悉 Socket 编程的同学应该很容易理解其中的语法,即使用 TCP 协议,监听 5555 端口,然后不停地接受、打印并返回信息,每次处理后停止 1 秒。

// Hello World server#include <zmq.h>#include <stdio.h>#include <unistd.h>#include <string.h>#include <assert.h>int main (void){    // Socket to talk to clients    void *context = zmq_ctx_new ();    void *responder = zmq_socket (context, ZMQ_REP);    int rc = zmq_bind (responder, "tcp://*:5555");    assert (rc == 0);    while (1) {        char buffer [10];        zmq_recv (responder, buffer, 10, 0);        printf ("Received Hello\n");        zmq_send (responder, "World", 5, 0);        sleep (1); // Do some 'work'    }    return 0;}

以下是 HelloWorld 项目的客户端代码(hwclient.c),逻辑也很简单,向服务端连续发送 10 条消息,接受并打印返回信息。

// Hello World client#include <zmq.h>#include <string.h>#include <stdio.h>#include <unistd.h>int main (void){    printf ("Connecting to hello world server…\n");    void *context = zmq_ctx_new ();    void *requester = zmq_socket (context, ZMQ_REQ);    zmq_connect (requester, "tcp://localhost:5555");    int request_nbr;    for (request_nbr = 0; request_nbr != 10; request_nbr++) {        char buffer [10];        printf ("Sending Hello %d…\n", request_nbr);        zmq_send (requester, "Hello", 5, 0);        zmq_recv (requester, buffer, 10, 0);        printf ("Received World %d\n", request_nbr);    }    zmq_close (requester);    zmq_ctx_destroy (context);    return 0;}

服务端代码的运行结果如图1-2。



客户端代码的运行结果如图1-3。



运行结果很容易理解,这就是一个标准的“请求-响应”模式的例子。从中我们可以看到使用 ZeroMQ 的类库实现起来还是很简单的,和基础 Socket 库的用法差不多,实现的功能也差不了多少,但是事实是否如此呢?在下一篇《ZeroMQ 深度探索(二)》中我们将深入讨论这个问题,未完待续...

TIP:建议大家使用 3.2 以上的版本进行开发。以后所有的的例子都是基于 C 语言的。所有的示例代码可以通过“git clone --depth=1 git://github.com/imatix/zguide.git”获取。
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 儿童7岁还坐不住怎么办 孩子缺锌手蜕皮裂开怎么办 宝宝读幼儿园哭怎么办 幼儿上课爱讲话怎么办 孩子上课总是乱跑怎么办 孩子听不懂老师讲课怎么办 高一上课听不懂怎么办 上课学生纪律差怎么办 一年级学生认字少怎么办 孩子上课做不住怎么办 幼儿园小孩上课乱跑怎么办 孩子挑食不爱吃饭怎么办 幼儿园孩子不听指令怎么办 1岁宝宝多动症怎么办 3岁宝宝胆小怎么办 爱挑食的孩子怎么办 小孩上课经常发呆怎么办 小孩不爱吃饭挑食怎么办 一年级小孩学习不好怎么办 宝宝上课坐不住怎么办 八个月婴儿拉稀怎么办 八个月孕妇拉稀怎么办 孩子好动爱喊怎么办 八个月小孩发烧怎么办 孩子好动怎么办学龄前教育 小孩好动症该怎么办 小孩子好动症该怎么办 怀孕5个月胎死亡怎么办 小孩多动调皮怎么办 手心老是出汗是怎么办 孩子吃饭特别慢怎么办 小孩子老想睡觉怎么办 孩子下午上课犯困怎么办 小孩子有多动症该怎么办 初中写作业犯困怎么办 孩子晚上学习困怎么办 小孩子容易兴奋激动怎么办 中考时过度兴奋怎么办 小孩兴奋不睡觉怎么办 孩子突然反常不听话怎么办? 婴儿亢奋不睡觉怎么办