没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
试读
230页
0MQ 看起来像是嵌入的网络库,但行为像一个并发的框架。它提供带所有信息并且跨 各种传输协议如进程间,进程内,广播等的套接字给你。你可以用多种方式实现 N 对 N 的 套接字连接,如扇出,发布订阅,请求应答。它足够快,因此可以制作集群。他的异步输 入输出模式为你提供了可扩展的多核应用,用来处理异步消息任务。它提供很多语言的套 接字,并且能够在很多操作系统上运行.0MQ 是 iMatix 公司研发的,是开源协议
资源详情
资源评论
ZeroMQ—指导
由 iMatix 公司的首席执行官 Pieter Hintjens <moc.xitami|hp#moc.xitami|hp>编写。感谢
Bill Desmarais, Brian Dorsey, CAF, Daniel Lin, Eric Desgranges, Gonzalo Diethelm, Guido
Goldstein, Hunter Ford, Kamil Shakirov, Martin Sustrik, Mike Castleman, Naveen Chawla,
Nicola Peduzzi, Oliver Smith, Olivier Chamoux, Peter Alexander, Pierre Rouleau, Randy
Dryburgh, John Unwin, Alex Thomas, rofl0r, Mihail Minkov, Jeremy Avnet, Michael Compton,
and Zed Shaw 的贡献,也感谢 Stathis Sideris,因为 Ditaa.。
请对所有的意见和勘误表进行问题跟踪。这个版本覆盖了 0MQ2.0 的版本,发表于周
二 2010 年 11 月 9 日,9 时 32 分 19 秒。
第一章——基础的东西
修理(fixing)这个世界
怎么解释 0MQ?有些人会说它的所有美好的事情。它是类固醇(steroids)上的套接字。
它像有路由的邮箱。它很快。别人想分享它的启蒙,当这一切变得越来越明显,人们开始
顿悟了。事情变得更简单。再也不复杂了。它打开了人们的思维。其他人喜欢通过做比较
的方式来解释。它更小,更简单,但是看起来仍然很熟悉。就我个人而言,我希望回忆起
我们为什么要开发 0MQ,因为,这是读者们也很想知道的问题。
编程是装扮成艺术的科学,因为我们中的大多数不了解软件的物理过程。如果学过这
方面的知识的话,也学的很少。软件的物理过程不是算法,数据结构,语言和抽象。这些
只是我们研发,使用,然后扔掉的工具。软件真正的物理过程实际上是人们的思维过程。
我们都有自己的局限性,当事情变的复杂的时候,我们希望一起协作,把大的问题分
成小的问题来处理。这就是科学的编程,开发人们能够理解和容易使用的模块。并且,人
们会一起协作来解决很大的问题。
我们生活在一个连通的世界,当代的软件必须引导这个世界。因此,未来的大型软件
的编连模块应该是连通的,并且是并行的。代码不能再是“强大而沉默”的。代码必须和
代码对话。代码必须是能交谈的,友善的,容易连通的。代码必须像人脑一样运行。万亿
的神经元彼此发送消息,一个没有中央控制的大规模并行网络,没有单点失败,能够解决
很困难的问题。毫无疑问,将来的代码将会运行的像人脑,因为,每个网络的终端都看起
来有些像人脑。
如果你做过一些关于线程,协议或者网络的工作,你就会意识到这是非常不可能的。
它是一个梦。当你真正处理生活中的情形时,甚至利用少量的套接字连接少量的程序都让
人不胜其烦。万亿?这个成本是没法想象的。连接计算机如此困难,所以,它的软件和技
术实现的费用达十几亿美元。
因此,我们现在的状况是,布线的能力比我们能够使用它的能力超前了几年。我们在
上世纪 80 年代遇到了软件危机,当时像
Fred Brooks 这样的人认为没有解决办法。免费的开
源软件解决了这次危机,让我们能够高效地分享知识。今天,我们遇到了另一个软件危机,但
是我们对这个话题谈论的不多。只有最大,最有钱的公司能够建立连接的应用程序。虽然有云
端运算网络,但是它是私有的。我们的数据 、知识从我们的电脑里消失,进入我们不能访问、
不能竞争的云网络。谁拥有我们的社会网络?相反,它像大型电脑革命。
我们把关于政治哲学的问题留给别的书来解决吧。问题是,因特网提供了大量代码能够连
接在一起的可能的同时,事实是对于我们中的大多数,都不能够实现它。因此,因为没有办法
连接代码,很多人们感兴趣的问题(如健康,教育,经济,运输等)仍然没有解决,也没有办
法连接人们的聪明来解决这些问题。
人们已经做过很多连接软件的尝试。因特网工程特别任务组制定了数以千记的规范,每个
规范解决部分问题。对应用开发人员来说,HTTP 可能是一个很简单的解决方案,但是它却可能
让问题变得更糟糕,它鼓励开发人员和工程师开发大型服务器和瘦的并且愚蠢的客户机。
因此,今天人们仍然通过原始 UDP 或者 TCP,专门的协议,HTTP,网络套接字来连接引
用程序。它仍然很困难,慢,难以升级,并且很集中。分布式 P2P 结构大多数只能是玩玩,不
能用于工作。有多少应用程序是使用 Skype 或者 Bittorrent 来交换数据的呢?
什么能够带我们回到科学的编程?为了修理(fixing)世界,我们需要做两件事。一件是,
解决这个普遍问题“如何在任何地方把任意的代码连接起来。”另一件是,用人们容易理解和
使用的简单的模块把它封装起来。
它听起来简单的荒谬。但可能它确实就是这么简单。它就是问题的所在。
用一百个字来描述 0MQ
0MQ 看起来像是嵌入的网络库,但行为像一个并发的框架。它提供带所有信息并且跨
各种传输协议如进程间,进程内,广播等的套接字给你。你可以用多种方式实现 N 对 N 的
套接字连接,如扇出,发布订阅,请求应答。它足够快,因此可以制作集群。他的异步输
入输出模式为你提供了可扩展的多核应用,用来处理异步消息任务。它提供很多语言的套
接字,并且能够在很多操作系统上运行.0MQ 是 iMatix 公司研发的,是开源协议。
一些假设
我们假设你使用的是最新版本的 0MQ,而且你是当今的 git 高手。我们假设你使用的是
Liux 系统或者类似的。我们假设你能够读懂 C 语言代码,因为我们的很多代码是用 C 语言
编写的。我们假设如果程序需要,当我们写常量如 PUSH 或者 SUBSCRIBER 你能够想的到
它们实际上是 ZMQ-PUSH 或者 ZMQ-SUBSCRIBER。
请求与响应
让我们开始写一些代码,我们当然是以世界你好这个例子开始。我们将会构造一个服
务器和一个客户机。客户机发送“HELLO”给服务器,将会得到响应“World”。 这是服务器
程序,它在端口 5555 打开一个 0MQ 套接字,并在端口读取请求,并对每一个请求都以
“World”应答。
//
// Hello World server
// Binds REP socket to tcp://*:5555
// Expects "Hello" from client, replies with "World"
//
#include <zmq.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main () {
void *context = zmq_init (1);
// Socket to talk to clients
void *responder = zmq_socket (context, ZMQ_REP);
zmq_bind (responder, "tcp://*:5555");
while (1) {
// Wait for next request from client
zmq_msg_t request;
zmq_msg_init (&request);
zmq_recv (responder, &request, 0);
printf ("Received request: [%s]\n",
(char *) zmq_msg_data (&request));
zmq_msg_close (&request);
// Do some 'work'
sleep (1);
// Send reply back to client
zmq_msg_t reply;
zmq_msg_init_size (&reply, 6);
memcpy ((void *) zmq_msg_data (&reply), "World", 6);
zmq_send (responder, &reply, 0);
zmq_msg_close (&reply);
}
zmq_term (context);
return 0;
}
套接字对 REQ-REP 是步伐一致的。客户机调用 ZMQ 发送函数,然后调用函数
zmq_send(3),然后调用函数 zmq_recv(3),这是一个循环(或者如果需要的话只调用一次 )。
使用别的任何序列(如在一行发送两个消息)都会出错。类似的,服务器按照先调用函数
zmq_recv(3),然后调用函数 zmq_send(3)的顺序,调用次数根据需要而定。
0MQ 使用 C 语言作为参考语言,并且我们也用 C 语言作为例子。如果你是在线入读本
文,这个例子下面的链接将会帮你转换为别的程序语言。让我们用 C++编写的相同的服务
器程序作为对比。
//
// Hello World server in C++
// Binds REP socket to tcp://*:5555
// Expects "Hello" from client, replies with "World"
//
#include <zmq.hpp>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
int main () {
// Prepare our context and socket
zmq::context_t context (1);
zmq::socket_t socket (context, ZMQ_REP);
socket.bind ("tcp://*:5555");
while (true) {
zmq::message_t request;
// Wait for next request from client
socket.recv (&request);
printf ("Received request: [%s]\n",
(char *) request.data ());
// Do some 'work'
sleep (1);
// Send reply back to client
zmq::message_t reply (6);
memcpy ((void *) reply.data (), "World", 6);
socket.send (reply);
}
return 0;
}
你可以看到在 C 语言或者 C++语言中使用的 0MQ 套接字很相像。像 pathon 这样的语
言,我们甚至可以隐藏更多,读起来更简单。
这个是 C 语言的客户机代码(单击源程序西面的链接,或者转换成你最喜欢的程序语
言 );
//
// Hello World client
// Connects REQ socket to tcp://localhost:5555
// Sends "Hello" to server, expects "World" back
//
#include <zmq.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
int main () {
void *context = zmq_init (1);
// Socket to talk to server
printf ("Connecting to hello world server...\n");
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++) {
zmq_msg_t request;
zmq_msg_init_data (&request, "Hello", 6, NULL, NULL);
printf ("Sending request %d...\n", request_nbr);
zmq_send (requester, &request, 0);
zmq_msg_close (&request);
剩余229页未读,继续阅读
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论2
最新资源