原文链接 http://www.aosabook.org/en/zeromq.html

ZeroMQ

ZeroMQ 是一个消息系统,或者‘面向消息的中间件’。广泛应用于金融服务,游戏开发,嵌入式系统,学术研究和航空航天领域。

消息系统基本上用于应用程序的即时消息传递,应用程序决定将事件传递给另一个应用程序(或多个应用程序),将要发送的数据组装,点击‘发送’按钮,然后消息系统来处理剩余的问题

与及时消息不同,消息系统没有GUI,假定在端点出现故障时没有人进行智能干预。因此,消息系统必须是容错的,而且比普通的及时消息要快的多 。

ZeroMQ最初被构想为股票交易中的超快速消息传递系统,所以重点是极端优化。该项目第一年是设计基准方法,试图定义尽可能高效的体系结构。

后来,大概是在第二年,重点转移到提供一个通用的系统,用于构建分布式应用程序和支持任意消息传递模式,多种传输机制,任意语言绑定等

在第三年,重点是提高可用性和扁平化学习曲线。我们采用了BSD套接字API,试图清理个人消息模式的语义等等。

希望本章能洞察以上三个目标是如何转化为ZeroMQ的架构的,并为那些正在解决同样问题的人提供一些建议。

应用和库

Zero是有一个库,不是一个消息服务器。

我们的主要关注点是性能:如果中间有一个服务器,每条消息将两次通过网络(发送者到代理,代理到接收者),包括延迟和吞吐量的损失。如果所有的消息都必须通过代理,在某些时候,一定会成为瓶颈。

其次是关于大规模部署:当部署跨越组织边界时,管理整个消息流的中心管理概念就不再适用。任何公司都不愿意将控制权让与其他公司的服务器;有商业秘密,也有法律责任。实际的结果是,每个公司都有一个消息服务器,用手写的网桥连接其他公司的消息系统。整个生态系统因此四分五裂,为每一家相关公司维护大量桥梁并不能使情况好转。为了解决这个问题,我们需要一个完全分布式的体系结构,即每个组件都可能由不同的业务实体管理。考虑到基于服务器的体系结构中的管理单元是服务器,我们可以通过为每个组件安装一个单独的服务器来解决这个问题。在这种情况下,我们可以通过使服务器和组件共享相同的流程来进一步优化设计。我们最终得到的是一个消息传递库。

当我们知道如何在没有中央服务器的情况下进行消息传递时,MQ就开始了。从一开始,MQ就是一个库,而不是一个应用程序。

经验教训是,当启动一个新项目时,如果可能的话,您应该选择库设计。从一个库中通过一个简单的程序调用它很容易,但是,从一个现有的可执行文件中创建一个库几乎是不可能的。库为用户提供了更大的灵活性,同时也为他们节省了不必要的管理工作。

全局状态

全局变量在库中不能很好地发挥作用。一个库可能在这个过程中加载好几次,但即使如此,也只有一组全局变量。下图显示了从两个不同和独立的库中使用的ZeroMQ库。然后应用程序使用这两个库。

当出现这种情况时,这两个实例都会访问相同的变量,从而导致竞争条件、奇怪的失败和未定义的行为。

dāng当   chū出   xiàn现   zhè这   zhǒng种   qíng情   kuàng况   shí时   ,   zhè这   liǎng两   个   shí实   例   dōu都   huì会   fǎng访   wèn问   xiāng相   tóng同   de的   biàn变   liàng量   ,   cóng从   ér而   dǎo导   zhì致   jìng竞   zhēng争   tiáo条   jiàn件   、   奇   guài怪   de的   shī失   bài败   和   wèi未   dìng定   义   de的   xíng行   wéi为   。

To prevent this problem, the ØMQ library has no global variables.

为了防止这个问题,ZeroMQ库没有全局变量。相反,库的使用者负责显式地创建全局状态。包含全局状态的对象称为上下文。虽然从用户的角度来看,上下文看起来类似于一个工作线程池,但从MQ的角度来看,它只是一个对象,用来存储我们碰巧需要的任何全局状态。在上面的图片中,libA和libB都有自己的上下文。

The lesson here is pretty obvious: Don't use global state in libraries. If you do, the library is likely to break when it happens to be instantiated twice in the same process.

这里的经验很明显:不要在库中使用全局状态。如果您这样做了,那么在同一进程中实例化两次库时,它可能会异常。

《Zero MQ》的更多相关文章

  1. 《吃透MQ系列》核心基础全在这里了

    这是<吃透XXX>技术系列的开篇,这个系列的思路是:先找到每个技术栈最本质的东西,然后以此为出发点,逐渐延伸出其他核心知识.所以,整个系列侧重于思考力的训练,不仅仅是讲清楚 What,而是 ...

  2. 《吃透MQ系列》之扒开Kafka的神秘面纱

    大家好,这是<吃透 MQ 系列>的第二弹,有些珊珊来迟,后台被好几个读者催更了,实属抱歉! 这篇文章拖更了好几周,起初的想法是:围绕每一个具体的消息中间件,不仅要写透,而且要控制好篇幅,写 ...

  3. 《Pro AngularJS》学习小结-01

    <Pro AngularJS>该书以一个SportsStore案例为主线铺开. 一.开发环境设置 该书中所用的数据库data server开发环境是Deployed,从来没听说过,而且作者 ...

  4. Linux之《荒岛余生》(三)内存篇

    原文:https://juejin.im/post/5c00aee06fb9a049be5d3641 小公司请求量小,但喜欢滥用内存,开一堆线程,大把大把往jvm塞对象,最终问题是内存溢出. 大公司并 ...

  5. 《高性能javascript》一书要点和延伸(上)

    前些天收到了HTML5中国送来的<高性能javascript>一书,便打算将其做为假期消遣,顺便也写篇文章记录下书中一些要点. 个人觉得本书很值得中低级别的前端朋友阅读,会有很多意想不到的 ...

  6. 《Effective java》-----读书笔记

    2015年进步很小,看的书也不是很多,感觉自己都要废了,2016是沉淀的一年,在这一年中要不断学习.看书,努力提升自己!预计在2016年要看12本书,主要涉及java基础.Spring研究.java并 ...

  7. 《Effective Java》学习笔记——积累和激励

    从一个实际案例说起 国庆长假前一个礼拜,老大给我分配了这么一个bug,就是打印出来的报表数量为整数的,有的带小数位,有的不带,毫无规律. 根据短短的两个多月的工作经验以及猜测,最终把范围缩小到以下这段 ...

  8. 《HelloGitHub月刊》第06期

    前言 <HelloGitHub>月刊做到第06期了(已经做了6个月了),在GitHub上获得了100+的stars,虽然不多,但是我很知足了,说明有人觉得这个项目是有价值的.同时园子中的' ...

  9. 《高性能javascript》 领悟随笔之-------DOM编程篇(二)

    <高性能javascript> 领悟随笔之-------DOM编程篇二 序:在javaSctipt中,ECMASCRIPT规定了它的语法,BOM实现了页面与浏览器的交互,而DOM则承载着整 ...

随机推荐

  1. CF1153E Serval and Snake

    题目地址:CF1153E Serval and Snake 这是一道交互题 由于只需要确定起点和终点 你选择的矩形会将整个矩形分成的两个部分 如果起点和终点在同一个部分里,那么很显然回答应该是个偶数 ...

  2. 通过go-ethereum源码看如何管理项目

    今天抽空看了下go-ethereum项目的源码 ( https://github.com/ethereum/go-ethereum ),其中 ethereum 是github下的一个帐号.go-eth ...

  3. OpenCV3编程入门-读书笔记2-core组件

    一.颜色空间缩减 1.概念 如果图像是3通道,深度为1个字节,则每个像素有256*256*256种可能值,这么多的可能值会对算法性能造成严重影响.利用颜色空间缩减就能解决这个问题,例如将颜色值0~9取 ...

  4. Flow Problem

    Flow Problem TimeLimit:5000MS  MemoryLimit:32768KB 64-bit integer IO format:%I64d   Problem Descript ...

  5. node中间层转发请求

    前台页面: $.get("/api/hello?name=leyi",function(rps){ console.info(rps); }); node中间层(比如匹配api开头 ...

  6. appJSON["window"]["navigationBarTextStyle"] 字段需为 black 或 white

    appJSON["window"]["navigationBarTextStyle"] 字段需为 black 或 white     改动成这个就可以了 &qu ...

  7. using 关键字的作用

    我们都知道可以使用using关键字引入命名空间,例如:using namespace std; using还有个作用是在子类中引入父类成员函数. 1) 当子类没有定义和父类同名的函数(virtual也 ...

  8. Python学习(三十八)—— Djago之Ajax

    转载自:http://www.cnblogs.com/yuanchenqi/articles/7638956.html 一.Ajax准备知识:json 什么是json? 定义: JSON(JavaSc ...

  9. 【Java】 剑指offer(30) 包含min函数的栈

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min ...

  10. 【AtCoder】【组合数学】【模型转换】Colorful Balls(AGC012)

    题意: 有n个球,每个球有两个值,一个是颜色,另一个是重量.可以进行如下的操作任意次: 1.选择两个颜色相同的球,如果这两个球的重量之和小于等于X,就交换这两个球: 2.选择两个颜色不同的球,如果这两 ...