《Zero MQ》
原文链接 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两 gè个 shí实 lì例 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件 、 qí奇 guài怪 de的 shī失 bài败 hé和 wèi未 dìng定 yì义 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》的更多相关文章
- 《吃透MQ系列》核心基础全在这里了
这是<吃透XXX>技术系列的开篇,这个系列的思路是:先找到每个技术栈最本质的东西,然后以此为出发点,逐渐延伸出其他核心知识.所以,整个系列侧重于思考力的训练,不仅仅是讲清楚 What,而是 ...
- 《吃透MQ系列》之扒开Kafka的神秘面纱
大家好,这是<吃透 MQ 系列>的第二弹,有些珊珊来迟,后台被好几个读者催更了,实属抱歉! 这篇文章拖更了好几周,起初的想法是:围绕每一个具体的消息中间件,不仅要写透,而且要控制好篇幅,写 ...
- 《Pro AngularJS》学习小结-01
<Pro AngularJS>该书以一个SportsStore案例为主线铺开. 一.开发环境设置 该书中所用的数据库data server开发环境是Deployed,从来没听说过,而且作者 ...
- Linux之《荒岛余生》(三)内存篇
原文:https://juejin.im/post/5c00aee06fb9a049be5d3641 小公司请求量小,但喜欢滥用内存,开一堆线程,大把大把往jvm塞对象,最终问题是内存溢出. 大公司并 ...
- 《高性能javascript》一书要点和延伸(上)
前些天收到了HTML5中国送来的<高性能javascript>一书,便打算将其做为假期消遣,顺便也写篇文章记录下书中一些要点. 个人觉得本书很值得中低级别的前端朋友阅读,会有很多意想不到的 ...
- 《Effective java》-----读书笔记
2015年进步很小,看的书也不是很多,感觉自己都要废了,2016是沉淀的一年,在这一年中要不断学习.看书,努力提升自己!预计在2016年要看12本书,主要涉及java基础.Spring研究.java并 ...
- 《Effective Java》学习笔记——积累和激励
从一个实际案例说起 国庆长假前一个礼拜,老大给我分配了这么一个bug,就是打印出来的报表数量为整数的,有的带小数位,有的不带,毫无规律. 根据短短的两个多月的工作经验以及猜测,最终把范围缩小到以下这段 ...
- 《HelloGitHub月刊》第06期
前言 <HelloGitHub>月刊做到第06期了(已经做了6个月了),在GitHub上获得了100+的stars,虽然不多,但是我很知足了,说明有人觉得这个项目是有价值的.同时园子中的' ...
- 《高性能javascript》 领悟随笔之-------DOM编程篇(二)
<高性能javascript> 领悟随笔之-------DOM编程篇二 序:在javaSctipt中,ECMASCRIPT规定了它的语法,BOM实现了页面与浏览器的交互,而DOM则承载着整 ...
随机推荐
- Why Random Initialization in Neural Network?
- Jetty - 教程
Jetty使用教程(一)——开始使用Jetty : https://www.cnblogs.com/yiwangzhibujian/p/5832597.html jetty 的工作原理以及与 Tomc ...
- Django模型层-多表操作
多表操作 一.创建模型 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情模型和作者模型之间是 ...
- ASP .NET Core HTTP Error 502.5 – Process Failure
页面返回错误 事件日志显示错误 大家可以先看着个链接 https://docs.microsoft.com/en-us/aspnet/core/publishing/iis?tabs=aspnetco ...
- PHP中的排序函数sort、asort、rsort、krsort、ksort区别分析
sort() 函数用于对数组单元从低到高进行排序. rsort() 函数用于对数组单元从高到低进行排序. asort() 函数用于对数组单元从低到高进行排序并保持索引关系. arsort() 函数用于 ...
- innodb文件损坏处理
innodb文件损坏报错如下: 2018-09-03T09:52:43.486363Z 0 [ERROR] InnoDB: Space id and page no stored in the pag ...
- QPS/TPS/并发量/系统吞吐量概念和公式
1.概念 我们在日常工作中经常会听到QPS/TPS这些名词,也会经常被别人问起说你的系统吞吐量有多大.一个系统的吞度量(承压能力)与request对CPU的消耗.外部接口.IO等等紧密关联,单个req ...
- ARKit1.5 采坑
1.对应的生成的预制体,0.1的大小按照Cube的实际大小进行缩放. Plane和Cube都是0.1的情况下是不一样的大小的.
- bzoj1040基环树
... st#include<cstdio> #include<iostream> #include<algorithm> #include<cmath> ...
- js-事件以及window操作
属性 当以下情况发生时,出现此事件 onblur 元素失去焦点 onchange 用户改变域的内容 onclick 鼠标点击某个对象 ondblclick 鼠标双击某个对象 onfocus 元素获得焦 ...