原文链接 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. 第二周 数据分析之展示 Matplotlib基础绘图函数实例

    Pyplot基础图表函数 Pyplot饼图的绘制: Pyplot直方图的绘制: Pyplot极坐标图的绘制: Pyplot散点图的绘制: 单元小结: import numpy as np import ...

  2. PostgreSQL快速入门

    一.PostgreSQL是什么? PostgreSQL是一个功能强大的开源对象关系数据库管理系统(ORDBMS). 用于安全地存储数据; 支持最佳做法,并允许在处理请求时检索它们. PostgreSQ ...

  3. VS2012遇到一个问题:"链接器工具错误 LNK2026 XXX模块对于 SAFESEH 映像是不安全的"

    解决方法: 1.打开该项目的“属性页”对话框. 2.单击“链接器”文件夹. 3.单击“命令行”属性页. 4.将 /SAFESEH:NO 键入“附加选项”框中,然后点击应用.

  4. sublime自动保存设置

    首选项——用户设置 (Preferences:Settings - User) 行末添加"save_on_focus_lost": true 注意用逗号分隔 保存即可 save_o ...

  5. java 网站用户在线和客服聊天

    注:本文来源于<java 网站用户在线和客服聊天> 这是应用到项目中的一个例子. 实现原理是将信息存储到Application域里面.然后使用Struts2 Action 用json格式的 ...

  6. hash与encrypt

    概括来说,哈希(Hash)是将目标文本转换成具有相同长度的.不可逆的杂凑字符串(或叫做消息摘要),而加密(Encrypt)是将目标文本转换成具有不同长度的.可逆的密文. 具体来说,两者有如下重要区别: ...

  7. Java设计模式迭代器

    定义:提供一种方法,顺序访问一个集合对象中的各个元素,而又不暴露该对象的内部表示. 类型:行为型 适用场景: 访问一个集合对象的内容而无需暴露它的内部表示 为遍历不同的集合结构提供一个统一的接口 优点 ...

  8. SQL反模式学习笔记8 多列属性

    目标:存储多值属性 反模式:创建多个列.比如一个人具有多个电话号码.座机号码.手机号码等. 1.查询:多个列的话,查询时可能不得不用IN,或者多个OR: 2.添加.删除时确保唯一性.判断是否有值:这些 ...

  9. Java模拟耗时任务异步执行

    说明:耗时任务开启单独线程处理,任务线程处理完毕通知主线程 1.回调接口定义 public interface ResponseCallBack { public void printMsg(Stri ...

  10. 前端js总结

    1 . 在controller层中的@ResponseBody注解中返回的要是一个对象而不能用字符串. 2 . 给html页面的按钮添加单击事件 $(#login).click( function l ...