《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则承载着整 ...
随机推荐
- 51nod 1228、1258 序列求和
这里一次讲两题...貌似都是板子? 所以两题其实可以一起做 [雾 noteskey 总之就是伯努利数的两道入门题啦,就是第二道有点鬼畜了,居然要任意模数的!(好吧是 1e9+7 但也没什么区别了) 伯 ...
- 递归遍历所有xml的节点及子节点
import java.io.File; import java.util.List; import org.dom4j.Attribute; import org.dom4j.Document; i ...
- WPF样式中TargetType 属性 (Property) 和 x:Key 属性 (Attribute)
如第一个示例所示,如果将 TargetType 属性设置为 TextBlock 而不为样式分配 x:Key,样式就会应用于所有 TextBlock 元素.这种情况下,x:Key 隐式设置为 {x:Ty ...
- liunx mysql 备份
执行命令:mysqldump -uroot -p lanwei > lanwei2018-08-02.sql 出错 -bash: mysqldump: command not found 查看m ...
- Apache服务器中设置端口映射和反向代理的方法
在/etc/httpd/conf路径下的httpd.conf文件###new add for webui.cong###Include "E:/local/Wamp/bin/apache/A ...
- python3 字典(dictionary)(一)
一.定义:是另一种可变容器模型,可存储任意类型对象:(也被称为关联数组或哈希表:存储的数据是没有顺序的) 语法为: d = {key1 : value1, key2 : value2 } #----- ...
- JavaScript我学之一变量类型
本文是网易云课堂金旭亮老师的课程笔记,记录下来,以供备忘. 变量类型 只有6种 : 四种原始数据类型boolean , number, string , undefine, 其他object,fun ...
- .net 枚举类型转换
数字转化名称 Enum.GetName(typeof(枚举), 数字); 名称转化数字 (int)枚举
- 如何用div绘制一个容器,例如圆形
需求:一个圆形的容器,里面有两种颜色,随比率不同而变化. 实现同一个容器中两种颜色变化的关键是css渐变 //background:linear-gradient(#818181 30%,#06FF3 ...
- Fiddler工具使用介绍
Fiddler基础知识 Fiddler是强大的抓包工具,它的原理是以web代理服务器的形式进行工作的,使用的代理地址是:127.0.0.1,端口默认为8888,我们也可以通过设置进行修改. 代理就是在 ...