ZeroMQ消息模式和架构设计_V06

上传人:xmg****18 文档编号:113765921 上传时间:2019-11-09 格式:PPT 页数:111 大小:2.25MB
返回 下载 相关 举报
ZeroMQ消息模式和架构设计_V06_第1页
第1页 / 共111页
ZeroMQ消息模式和架构设计_V06_第2页
第2页 / 共111页
ZeroMQ消息模式和架构设计_V06_第3页
第3页 / 共111页
ZeroMQ消息模式和架构设计_V06_第4页
第4页 / 共111页
ZeroMQ消息模式和架构设计_V06_第5页
第5页 / 共111页
点击查看更多>>
资源描述

《ZeroMQ消息模式和架构设计_V06》由会员分享,可在线阅读,更多相关《ZeroMQ消息模式和架构设计_V06(111页珍藏版)》请在金锄头文库上搜索。

1、,维度软件应用,ZeroMQ消息模式和架构设计,内容,ZeroMQ基础知识 ZeroMQ消息模式(内置模式和高级模式),内容,ZeroMQ基础知识 ZeroMQ消息模式(内置模式和高级模式),ZeroMQ是什么?,0MQ看起来像是嵌入的网络库,但行为像一个并发的框架。它提供所有信息的传递并且跨各种传输协议,如进程间、进程内线程、广播等的套接字。你可以用多种方式实现N对N的套接字连接,如扇出、发布订阅、请求应答等。它足够快,因此可以制作集群。它的异步输入输出模式为你提供了可扩展的多核应用,用来处理异步消息任务。它提供很多语言的套接字,并且能够在很多操作系统上运行。0MQ是iMatix公司研发的,

2、是开源协议。,TCP sockets and ZeroMQ sockets,ZeroMQ套接字是异步的。 他们可能实现特定的模式。 TCP套接字是一对一而ZeroMQ套接字多对多的连接。然而,您可以根据您的需要和sockets类型用ZeroMQ实现一对多、一对一、多对一和多对多的多种连接。 ZeroMQ套接字发送消息而TCP传输字节。 在ZeroMQ sockets 中,I / O是在后台完成。因为它们是工作在队列中。 与TCP不同,ZeroMQ sockets不要在乎目的地存在与否。 ZeroMQ sockets可以传输数据到多个节点和从多个节点接收数据。,为什么使用ZeroMQ(1)?,如

3、今,很多应用程序的组成部分会跨越某些网络,或者是局域网,或者是互连网。很多开发人员最终都开始做消息方面的工作。一些开发人员使用消息队列产品,但很多时候他们利用TCP或者UDP做自己的产品。这些协议使用起来不难,但是以任何一种可靠的方式发送消息与从A发送几个字节到B有很大的不同。 让我们来看看当我们利用原始TCP套接字连接各部分(pieces)时所遇到得典型的问题。任何可以重复利用的消息层都会解决所有或者以下的所有或者绝大部分问题: 我们怎样处理输入/输出?让我们的应用程序阻塞,或者是我们在后台处理输入/输出?这是设计决策的关键。阻塞式输入/输出创建的构架不容易升级扩展。后台运行输入/输出很难保

4、证正确。 我们怎样处理动态(dynamic)部分,即会暂时撤去的部分?我们要正式划分“客户“和”服务器“,并规定服务器不能撤离吗?如果我们想把服务器连接到服务器会怎样?我们应该每隔几秒就尝试着重新连接吗? 我们在线路上怎样表示消息?我们应该怎样组帧数据才能够方便读写,避免缓冲区溢出,使小的消息能够高效?能够适合大的影片带帽子的跳舞猫的发送。,为什么使用ZeroMQ(2)?,我们把消息队列存储在哪?如果部件读取消息队列很慢,导致我们的队列不断增大怎么办?我们应该采取什么策略呢? 我们怎样处理丢掉的消息?我们应该等待新的数据,或者请求重新发送,或者我们建立比较可靠的一层以确保消息不会丢失?如果这个

5、层本身崩溃掉怎么办? 如果我们需要不同的网络来传输怎么办?用广播代替TCP单播?或者使用Ipv6?我们需要重新编写应用程序吗?或者对传输协议进行抽象? 我们怎样对消息进行路由?我们能够把相同的消息发送到多个接收点(peer)吗?我们能够把应答发挥到请求着吗? 我们怎样用另一种语言编次应用程序接口函数?我们重新实现线路协议还是打包成一个库?如果是前者,我们怎样能够保证高效和稳定的栈?如果是后者,我们怎样能够保证通用性? 我们怎样表示数据才能够在不同的结构间读取?我们要执行特定编码的数据类型吗?什么时候这才会是消息系统的任务,而不是高层的? 我们怎样处理网络错误?我们是等待,再试,静静地忽略它们,

6、或者中止呢?,ZeroMQ能做什么?,它在后台线程处理输入/输出程序。这些应用程序进程线程之间的通信使用的是没有锁的数据结构,因此,0MQ的应用程序不需要锁、信号量、或者别的等待状态。 可以自由加入和撤出组件,0MQ可以动态地再连接。这就意味着你可以以任意的顺序开始组件。你可以创建:面向服务的结构“(SOAS),服务器可以随时加入或者离开网络。 当需要的时候消息会自动排队。在消息排队前,它聪明地把消息放得离接收者尽可能的接近。 它有办法处理过满队列(叫做“高水位标记“)。当一个队列满了以后,0MQ自动地阻塞发送者,或者把消息扔掉,这取决于你处理的消息的类型(就是所谓的“模式”)。 它允许你的应

7、用程序之间以任意的传输协议交谈:TCP、广播、进程间、或者进程内。你使用不同的传输协议的时候不需要改变代码。 它利用取决于消息模型的不同的策略安全地处理慢的/阻塞的读取方式。 它允许你用不同的模型路由消息,如请求-应答、和发布-订阅等。这些模型就是你怎样创建的拓扑和网络结构。 当发送的时候,它就在线路上利用简单的帧把所有消息分发出去了。如果你写了10K的消息,你就会收到10K的消息。 它不给消息加任何格式。它们是一个整体,大小可从零到千兆字节。如果你想描述数据,你可以选择第三方产品,例如谷歌的协议栈、XDR和别的。 它很聪明地处理网络错误。有时它会再试,有时它告诉你一个操作失败。 它减少你的碳

8、(carbon)排放。做的多但是使用的处理器很少,意味着你的机子使用的功耗更低,这样你的老机子可以使用更长时间。人工智能的Gore公司应该会喜欢0MQ。,定制开发的知识准备,我们假设你使用的是最新版本的0MQ,而且你是当今的git高手。我们假设你使用的是Liux系统或者类似的。我们假设你能够读懂C语言代码,因为我们的很多代码是用C语言编写的。我们假设如果程序需要,当我们写常量如PUSH或者SUBSCRIBER你能够想的到它们实际上是ZMQ-PUSH或者ZMQ-SUBSCRIBER。,资料,http:/zeromq.org/ 在线文档: http:/zguide.zeromq.org/page:

9、all 权威资料(ZeroMQ创始人著): ZeroMQ, Messaging for Many Applications 中文资料: ZeroMQ指南(翻译,错误很多) ZeroMQ中文博客: ,内容,ZeroMQ基础知识 ZeroMQ消息模式(内置模式和高级模式),Core Messaging Patterns,The built-in core MQ patterns are: Request-reply, which connects a set of clients to a set of services. This is a remote procedure call and t

10、ask distribution pattern. Publish-subscribe, which connects a set of publishers to a set of subscribers. This is a data distribution pattern. Pipeline, which connects nodes in a fan-out/fan-in pattern that can have multiple steps and loops. This is a parallel task distribution and collection pattern

11、.,ZeroMQ内置消息模式,请求与相应模式 连接一组客户一组服务。这是一个远程过程调用和任务分配模式。 发布与订阅模式 连接一组发布者和一组订阅者。这是一个数据分布模式。 管道模式 连接节点在可以有多个步骤和循环的扇入/扇出模式。这是一个并行任务的分发和收集模式。,Request-Reply模式,C语言代码(Server),/ Hello World server #include #include #include #include #include int main (void) / Socket to talk to clients void *context = zmq_ctx_ne

12、w (); 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 Hellon“); zmq_send (responder, “World“, 5, 0); sleep (1); / Do some work return 0; ,C+代码(Server),#inc

13、lude #include #include #include 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 ( ,C语言代码(Client),/ Hello World client #incl

14、ude #include #include #include int main (void) printf (“Connecting to hello world servern“); 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 b

15、uffer 10; printf (“Sending Hello %dn“, request_nbr); zmq_send (requester, “Hello“, 5, 0); zmq_recv (requester, buffer, 10, 0); printf (“Received World %dn“, request_nbr); zmq_close (requester); zmq_ctx_destroy (context); return 0; ,C+代码(Client),#include #include #include int main () / Prepare our co

16、ntext and socket zmq:context_t context (1); zmq:socket_t socket (context, ZMQ_REQ); std:cout “Connecting to hello world server“ std:endl; socket.connect (“tcp:/localhost:5555“); / Do 10 requests, waiting each time for a response for (int request_nbr = 0; request_nbr != 10; request_nbr+) zmq:message_t request (6); memcpy (void *) request.data (), “Hello“, 5); std:cout “Sending Hello “ request_nbr “ std:endl; soc

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号