专栏首页Java识堂消息中间件的发展史是一个有趣的历史故事

消息中间件的发展史是一个有趣的历史故事

前言

可能你在没学消息中间件之前都已经听过很多概念了,JMS,AMQP,ActiveMQ,RabbitMQ,Kafka,RocketMQ,一个消息中间件怎么能搞出怎么多概念?乱不乱啊, 别烦,本文从历史的角度帮你理清这些MQ和协议之间的关系。

什么是消息中间件?

消息中间件属于分布式系统中的一个子系统,关注于数据的发送和接收,利用高效可靠的消息传递机制对分布式系统中的其余各个子系统经进行集成

消息中间件的使用场景

1.异步处理

非核心流程异步化,提高系统响应性能

原来用户注册一下可能得依次写数据库,发送邮件和短信后,才能提示用户注册成功 现在只要写数据库,写消息队列后就直接提示用户注册成功,发送邮件和短信是异步处理,提高了响应速度

2.应用解耦

系统不是强耦合,消息接受者可以随意增加,而不需要修改消息发送者的代码。消息发送者的成功不依赖消息接受者

rpc实现

消息队列实现 如果库存系统出了问题,用户就不能正常下单,这是不合理的。可以通过消息队列来解耦。 当有新的系统如广告系统对用户的订单也感兴趣的时候,只需要从消息队列中拿消息即可,订单系统完全不用改变

3.流量削峰

当上下游系统处理能力存在差距的时候,可以用消息队列进行缓冲

当有秒杀业务时,一下有大量请求涌入时,很可能造成系统瘫痪,此时可以用消息队列缓冲一下

4.日志处理

将消息队列用在日志处理中,比如Kafka可以用来解决大量日志传输的问题

5.消息通讯

消息队列一般都内置了高效的通信机制,因此也可以用于单纯的消息通讯,比如实现点对点消息队列或者聊天室等

消息中间件编年史

1.初见曙光 消息中间件其实诞生的很早,在互联网应用还是一片荒芜的年代,有个在美国的印度哥们Vivek Ranadive就设想了一种通用软件总线,采用发布订阅的模式,像主板上的总线一样供其他相应程序接入。他创办了一家公司Teknekron,实现了世界上第一个消息中间件The Information Bus(TIB)

2.各自为战 TIB受到了企业的欢迎,Teknekron的业务发展引起了当时最牛气的IT公司IBM的注意,于是他们也开始研发了自己消息队列软件,于是才有了后来的wesphere mq,微软也陆续加入了战团。由于商业壁垒,商业MQ供应商想要解决应用互通的问题,而不是去创建标准来实现不同MQ产品间的互通,或者允许应用程序更改MQ平台

3.劫制天下 为了打破这个壁垒,同时为了能够让消息在各个消息队列平台间互融互通, JMS (Java Message Service) 应运而生 。JMS 试图通过提供公共 Java API 的方式,隐藏单独 MQ 产品供应 商提供的实际接口,从而跨越了壁垒,以及解决了互通问题。从技术上讲, Java 应用程序只需 针对 JMS API 编程,选择合适的 MQ 驱动即可, JMS 会打理好其他部分 。ActiveMQ 就是 JMS 的 一种实现 。不过尝试使用单独标准化接口来胶合众多不同的接口,最终会暴露出问题,使得 应用程序变得更加脆弱 。所以急需一种新的消息通信标准化方案 。

4.一统江湖 4.在 2006 年 6 月,由 Cisco 、 Redhat 、iMatix 等联合制定了 AMQP 的公开标准,由此 AMQP 登上了历史的舞台 。它是应用层协议的一个开放标准,以解决众多消息中间件的需求和拓扑结 构问题 。它为面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,并不受 产品、开发语言等条件的限制 。

5.合久必分 LinkedIn在实现消息队列的时候觉得AMQP规范并不适合自己,所以Kafka并不支持AMQP协议。RocketMQ在实现上借鉴了Kakfa的思想,所以也不支持AMQP协议,并且你会发现在Kafka和RocketMQ中都有类似Topic和Consumer Group的概念,而这些概念在AMQP协议中是不存在的

如何选择消息中间件

  1. ActiveMQ 的社区算是比较成熟,但是较目前来说,ActiveMQ 的性能比较差,而且版本迭代很慢,不推荐使用。
  2. RabbitMQ 在吞吐量方面虽然稍逊于 Kafka 和 RocketMQ ,但是由于它基于 erlang 开发,所以并发能力很强,性能极其好,延时很低,达到微秒级。但是也因为 RabbitMQ 基于 erlang 开发,所以国内很少有公司有实力做erlang源码级别的研究和定制。如果业务场景对并发量要求不是太高(十万级、百万级),那这四种消息队列中,RabbitMQ 一定是你的首选。如果是大数据领域的实时计算、日志采集等场景,用 Kafka 是业内标准的,绝对没问题,社区活跃度很高,绝对不会黄,何况几乎是全世界这个领域的事实性规范。
  3. RocketMQ 阿里出品,Java 系开源项目,源代码我们可以直接阅读,然后可以定制自己公司的MQ,并且 RocketMQ 有阿里巴巴的实际业务场景的实战考验。RocketMQ 社区活跃度相对较为一般,不过也还可以,文档相对来说简单一些。还有就是阿里出台的技术,你得应对这个技术万一被抛弃,社区黄掉的风险,如果你们公司有技术实力我觉得用RocketMQ 挺好的
  4. Kafka 的特点其实很明显,就是仅仅提供较少的核心功能,但是提供超高的吞吐量,ms 级的延迟,极高的可用性以及可靠性,而且分布式可以任意扩展。同时 Kafka 最好是支撑较少的 topic 数量即可,保证其超高吞吐量。Kafka 唯一的一点劣势是有可能消息重复消费,那么对数据准确性会造成极其轻微的影响,在大数据领域中以及日志采集中,这点轻微影响可以忽略。Kafka天然适合大数据实时计算以及日志收集。

AMQP协议详解

前面说到消息中间件有2种协议,JMS和AMQP。JMS你可以类比为JDBC,搞了一套接口让不同厂商来实现这个接口,但是这个协议设计的确实不够优雅,因此就不介绍这个协议了,除非你用ActiveMQ,不然学了真没啥用。详细说一下AMQP协议,毕竟现在用RabbitMQ的公司还是很多的,要想学好RabbitMQ,AMQP协议是必须要清楚的。

AMQP协议模型 上图是AMQP协议中一个消息的流转过程,画的的很清楚,不详细介绍了。

AMQP核心概念

介绍一些AMQP协议常见的概念。

概念

解释

Server

又称Broker,接受客户端的连接,实现AMQP实体服务

Connection

一个网络连接,比如TCP/IP套接字连接

Channel

多路复用连接中的一条独立的双向数据流通道。为会话提供物理传输介质

Message

消息,服务器和应用程序之间传送的数据,由Properties和Body组成。Properties可以对消息进行修饰,比如消息的优先级,延迟等高级特性,Body则就是消息体内容

Virtual Host

虚拟地址,用于进行逻辑隔离,最上层的消息路由。一个Virtual Host里面可以有若干个Exchange和Queue,同一个Virtual Host里面不能有相同名称的Exchange或Queue

Binding

消息队列和交换器之间的关联

Routing Key

一个消息头,交换器可以用这个消息头决定如何路由某条消息

Message Queue

消息队列,用来保存消息直到发送给消费者

如果有用过ActiveMQ和RabbitMQ,对上面的名词一定不会陌生。后面一篇文章就结合RabbitMQ来阐述上面的概念。

参考资料

[1]《Java工程师面试突击第1季-中华石杉老师》 [2]《RabbitMQ实战指南》 [3]《Java互联网架构师-享学课堂》

本文分享自微信公众号 - Java识堂(erlieStar),作者:李立敏

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-12-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 一文深入掌握druid

    Druid是专用于基于大数据集的实时探索分析的开源数据存储。该系统包括列式存储,分布式的无共享架构,高级索引结构,可用于任意探索具有次秒级延迟的十亿行级的数据表...

    Spark学习技巧
  • 闪耀在 UNIX 传奇往事中的启示, UNXI 见证者带你一览究竟

    UNIX是现代操作系统的鼻祖。从UNIX到FreeBSD,再到OS X,最后到iOS应运而生。由于UNIX的版权纠纷和Minix的封闭,Linux诞生了,而后又...

    AI科技大本营
  • 数据可视化︱技术恒久远,城市永流传(两则)

    大数据文摘
  • 涂子沛:中国文化缺乏数据因子

    人物简介 涂子沛,江西吉安人,生于1973年。本科毕业于华中科技大学计算机系,研究生分别就读于中山大学和卡内基梅隆大学。现居美国硅谷。2012年其著作《大...

    小莹莹
  • 快速找到OEACLE的性能问题

    对于传统应用系统,一旦系统性能测试达标上线后,后续出现性能恶化除了业务徒增之外,十有八九都是数据库惹的祸。通过快速的业务量比对排除异常后,重点的问题排查就要放到...

    企鹅号小编
  • 基于 Chaos Mesh® 和 Argo 打造分布式测试平台

    不久前我们开源了基于 Kubernetes 的混沌测试工具 Chaos Mesh®,Chaos Mesh 提供了模拟系统异常状况的能力,但这只是混沌工程中的一环...

    PingCAP
  • 2017精典书店年度好书

    精典书店 “岁月别催” 2017精典书店年度好书 ? 你有多久没有读书了? 你有多久没有认真读一本书了? 你有多久没有读完一本书了? ...... 你总是说,你...

    企鹅号小编
  • VR+文化遗产:文物虚拟修复,为文化遗产插上翅膀

    VRPinea
  • 港大推荐书单

    书是人类进步的阶梯,读书开阔视野,拓宽境界。这些推荐的书籍涵盖了经济、心理、商业、历史、人文…是不可多得的精神产物。留着吧,有事没事读一读,提升自己的思想境界。

    用户1756920
  • Tableau官方推荐:12本关于数据可视化的好书

    你想了解更多关于数据可视化的理论知识和历史背景吗?你想受到令人惊叹的可视化示例的启发吗?你希望能够创建更有效的可视化效果吗?或者你是否有兴趣从权威部门获取有关数...

    Python猫
  • 超实用运维经验:TEMP表空间不足、热块竞争经典案例

    作者介绍 ? 邓秋爽 云和恩墨技术专家,擅长于SQL tuning、troubleshooting 系统运行过程中可能遇见各种各样的性能问题,如果仅仅是当前系统...

    数据和云
  • 下暴雨出不了门?这有27部优秀的黑客纪录片

    大数据文摘
  • DevOps 下的文档及其版本管理之实战

    在上一篇《 DevOps 下的文档及其版本管理之设计篇》中简要介绍了文档及其版本管理的设计思路,该篇将讲述其实际操作部分的内容。上篇文章中讲到文档信息保存在两个...

    DevOps时代
  • 身未动 心已远

    最近,云煮鸡和工友们的寒暄话题, 已经从「吃了吗」,变成「国庆去哪玩」。 「人人从众叕」也是国庆出游绕不开的话题。 趁着还没出门,云煮鸡教大家几招, 足不出...

    腾讯云计算产品团队
  • 自己动手,丰衣足食:我为博物馆造了一个推荐系统

    通过收集分析参观者的行为数据,数据侠Belinda设计了一套简单的推荐系统,让一家老牌传统博物馆重新变得鲜活起来。你不用担心在参观时,会被博物馆卷帙浩繁的历史厚...

    DT数据侠
  • 巴黎圣母院会不会数字重建 用科技激活历史遗迹?

    ? 2019年4月16日,北京时间0点,法国著名建筑巴黎圣母院突发大火,塔尖坍塌、玫瑰花窗烧毁,整个建筑受损严重,800年的历史正面临着摧残。 ? 起火的原因...

    腾讯文旅
  • VR让观众对“战后余痛”感同身受,凝视历史进而反思战争

    1914年的这个时候,世界正处在第一次世界大战的“修罗场”中,那是20世纪历史上极为黑暗和悲惨的岁月。据统计,一战期间约有6500万人参战,1000多万人丧生,...

    VRPinea
  • 埃航失事!纵观历史空难数据!

    3月10日上午,一架从埃塞俄比亚首都亚的斯亚贝巴前往肯尼亚内罗毕的埃航波音737 MAX 8客机坠毁,机上载有149名乘客和8名机组人员,157人全部遇难。

    PM小王
  • 埃航失事!纵观历史空难数据!

    3月10日上午,一架从埃塞俄比亚首都亚的斯亚贝巴前往肯尼亚内罗毕的埃航波音737 MAX 8客机坠毁,机上载有149名乘客和8名机组人员,157人全部遇难。

    挖数

扫码关注云+社区

领取腾讯云代金券