每天早上七点三十,准时推送干货

关于消息队列,断断续续的看了很多资料,一直想抽个时间把这些知识整理记录下来,但是没腾出时间来写,正好所在的项目在实际业务中使用到了消息队列,索性就将这方面的知识整理一下,可能有理解不到位的地方,望网友批评指出!

一、消息队列由来

可能在你没了解消息队列之前,已经听过很多概念了,例如 JMS,AMQP,ActiveMQ,RabbitMQ,RocketMQ,Kafka 等等。

一个消息中间件,咋搞出这么多概念?

别慌,我们先从历史角度来理清这些 MQ 和协议之间的关系!

消息中间件其实诞生的很早,在互联网应用还是一片荒芜的年代,有个在美国的印度小哥 Vivek Ranadive 就设想了一种通用软件总线,采用发布订阅的模式,类似于电脑主板上的总线,新的设备或者程序如果想和电脑上其他的设备软件通信,只需要按照协议对接总线就可以完成接入和通信!

在 1983 年,26岁的印度小哥 Vivek Ranadive 创办了一家公司 Teknekron,实现了世界上第一个消息中间件The Information Bus(TIB)。

很快 TIB 软件受到了企业的欢迎,最初被高盛集团用于解决金融交易,Teknekron 的业务发展速度甚至引起了当时最牛逼的 IT 公司 IBM 的注意。

于是 IBM 也开始组建团队来研发自己的消息队列软件,这才有了后来的wesphere mq,不久微软也加入了战团。

由于商业壁垒,每个软件厂商都按照自己的标准来实现软件通信,导致企业客户不能随便更换 MQ 平台。

为了打破这个壁垒,同时为了能够让消息在各个消息队列平台间互融互通, JMS (Java Message Service) 应运而生 。

JMS 试图通过提供公共 Java API 的方式,隐藏单独 MQ 产品供应商提供的实现接口,从而跨越了壁垒,已解决互通问题。

从技术上讲, Java 应用程序只需针对 JMS API 进行编程,选择合适的 MQ 驱动即可, JMS 会打理好其他部分,就好比类似于 JDBC,对于开发者来说,只需要编写好 sql,具体是使用 oracle 还是 mysql 或者 sqlserver,由具体的厂商来提供驱动包文件即可,开发者无需关心具体的数据库厂商,从而大大的提升了开发效率、降低了开发难度。

ActiveMQ 就是 JMS 的 一种具体实现。

  • JMS - 点对点模型

JMS - 点对点模型
  • JMS - 发布订阅模型

JMS - 发布订阅模型

尽管使用标准化接口能有效的融合众多不同的 MQ 产品,但是也暴露出很多问题,例如有些 MQ 产品提供了非常高级的功能,但由于标准化接口的限制,导致用户无法使用,所以急需一种新的消息通信标准化方案。

在 2006 年 6 月,由 Cisco 、 Redhat 、iMatix 等人联合制定了 AMQP 的公开标准,由此 AMQP 登上了历史的舞台。

AMQP 是应用层协议的一个开放标准,以解决众多消息中间件的需求和拓扑结构问题,它为面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,同时并不受产品、开发语言等条件的限制。

  • JMS vs AMQP

RabbitMQ 就是 AMQP 的一种具体实现。

AMQP - 模型

随着时间的推进,虽然 AMQP 规范能适用的业务场景很多,但是 LinkedIn(领英) 在实现消息队列的时候觉得 AMQP 规范并不适合自己,于是在设计 Kafka 的时候,并不支持 AMQP 所有的特性。

同时阿里巴巴的 RocketMQ 在实现上也借鉴了 Kakfa 的思想,也不支持 AMQP 协议,并且你会发现在 Kafka 和 RocketMQ 中都有类似 Topic 和 Consumer Group 的概念,而这些概念在 AMQP 协议中并不存在。

二、为什么要使用消息队列

消息中间件虽然发展了很多年,但是不是每个项目都有机会能接触到消息队列,对于初次接触 MQ 的同学,难免会发出一些疑问!

什么是消息队列为什么要使用消息队列使用消息队列有哪些弊端

对于传统的应用程序,如果需要向另一个应用程序发送信息,只需要向其发出请求即可!

这种方式虽然简单直接,但是如果应用程序2突然挂了,应用程序1可能会因为服务异常,而无法继续提供服务!

设想一下,在应用程序1和应用程序2之间,插入一个消息服务,主要用于接受消息和发送消息,这样应用程序1和应用程序2之间的依赖关系就解耦了,同时也不会因为任何一方当服务不可用时,无法继续提供服务!

其中插入的消息服务被称为消息队列

由此可见,引入消息队列带来的优势很明显:

  • 程序解耦:应用程序1和应用程序2在进行交互时,不会因为一方服务中断而导致服务停止;

  • 异步处理:程序解耦之后,带来的最大的好处就是可以异步处理,应用程序1只管把消息发送到消息中间件,应用程序2只需要从消息中间件中接受消息然后进行处理即可;

同时,基于异步处理特性,在某些业务场景下,例如商品秒杀活动,引入消息队列之后,当客户端请求量很大的时候,可以有效的进行流量削峰

如果没有中间层做缓冲,当进行商品秒杀时,一下突然大量请求涌入,很可能造成系统直接瘫痪,甚至宕机!

在大型网站系统中,如何通过日志快速实时定位系统异常的代码,可以说至关重要!

LinkedIn 开发的消息队列 Kafka,可以说是日志采集方面的王者,在中、大型系统开发中,将消息队列 Kafka 用在日志处理中,可以有效的解决大量日志传输的问题。

当然,引入消息队列也会带来很明显的弊端:

  • 系统可用性降低:在引入消息队列之前,你不用考虑消息丢失或者消息队列服务挂掉等等的情况,但是引入消息队列之后你就需要去考虑这些问题!

  • 系统复杂性提高:加入消息队列之后,你需要保证消息没有被重复消费、处理消息没有被正确处理的情况等等问题!

引入消息队列虽然会带来一些问题,俗话说,兵来将挡、水来土掩,这句话同样适用于 IT 开发者,有坑填坑!

对于系统可用性降低方面,通常常用的解决方案就是搭建消息服务集群,具体技术实现上可以是主从架构或者分布式架构,即时一台消息队列服务机器挂了,也不会影响消息队列无法提供服务!

对于系统复杂性提高方面,常用的解决方案也很多,例如接受者接受到消息之后,可以先将消息写入数据库,即时没有被正确处理,还可以走人工处理,或者消息消费失败,将消息重新入队等待下一次消费等等。

三、常见的消息队列对比

目前比较主流的 MQ 产品,有 ActiveMQ,RabbitMQ,RocketMQ,Kafka,并且他们都是开源的,他们各自也有各自的特点。

总结内容如下

  • 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天然适合大数据实时计算以及日志收集。

四、总结

本文主要对消息队列的历史和基础知识进行梳理和初步介绍,如果有理解不对的地方,望网友批评指出!

在下一篇,会详细介绍 RabbitMQ 的使用!

五、参考

1、Java工程师面试突击第1季-中华石杉老师

2、消息中间件的发展史

3、JavaGuide - 消息队列

1. 人人都能看懂的 6 种限流实现方案!

2. 一个空格引发的“惨案“

3. 大型网站架构演化发展历程

4. Java语言“坑爹”排行榜TOP 10

5. 我是一个Java类(附带精彩吐槽)

6. 看完这篇Redis缓存三大问题,保你能和面试官互扯

7. 程序员必知的 89 个操作系统核心概念

8. 深入理解 MySQL:快速学会分析SQL执行效率

9. API 接口设计规范

10. Spring Boot 面试,一个问题就干趴下了!

扫码二维码关注我

·end·

—如果本文有帮助,请分享到朋友圈吧—

我们一起愉快的玩耍!

你点的每个赞,我都认真当成了喜欢

面试官提问:说说你对消息队列的理解相关推荐

  1. 第十二期:面试官问你什么是消息队列?把这篇甩给他!

    消息队列不知道大家看到这个词的时候,会不会觉得它是一个比较高端的技术,反正我是觉得它好像是挺牛逼的. 一.什么是消息队列? 消息队列不知道大家看到这个词的时候,会不会觉得它是一个比较高端的技术,反正我 ...

  2. 面试官问你什么是消息队列?把这篇甩给他!

    来源:Java3y(ID:java3y) 一.什么是消息队列? 消息队列不知道大家看到这个词的时候,会不会觉得它是一个比较高端的技术,反正我是觉得它好像是挺牛逼的. 消息队列,一般我们会简称它为MQ( ...

  3. 面试SEO岗位时会问的问题有哪些?SEO面试官提问

    面试seo岗位时会问的问题有哪些? 面试官会怎么样提问?[追梦者seo顾问团队] 作为一名SEOER来说,去某个企业做SEO优化的前提是必须要面对面试官问的SEO问题,其实笔者在面试多个SEO职位的时 ...

  4. 25 个 questions, 教你向面试官提问!

    专栏 | 九章算法 网址 | http://www.jiuzhang.com 有很多童鞋会问:面试的时候向面试官提什么问题比较合适? 这部分其实并不是非常重要的,因为基本不会影响你的面试结果. 但是, ...

  5. vue 2.0响应式源码实践,麻麻,我再也不怕被面试官提问啦

    vue2.0/vue3.0响应式源码实践,麻麻,我再也不怕被面试官提问啦 写在前面 vue2.0响应式源码实现 1. 先创建一个对象 2.实现observer方法 3.接下来我们对observer函数 ...

  6. Vue解析--如何应对面试官提问

    近期不断面试中,面试官都会提一些关于Vue相关的源码和"全家桶"之类的问题.那么针对这些提问,我们应该如何更好应答呢?在这里我把对Vue的理解整理出来供大家来参考. 1.Vue是什 ...

  7. Java面试汇总四 当下主流MQ消息队列的优缺点

    一.开发语言:1.Java是运行在JVM上的语言.2.erlang和最近比较火的和go语言一样是从代码级别就支持高并发的一种语言, 二.协议:1.RabbitMQ天生就有很高的并发性能,但是 有Rab ...

  8. 如何回答面试官提问:如果你进入公司,会怎样开展工作?

    一场面试就是面试官站在当下,深入了解"过去的你",看"现在的你"的表现,判断"未来的你"是否适合公司发展的过程.在了解完求职者的能力.经验后 ...

  9. 面试总结(四):消息队列

    问题导读: 1.什么是异步处理? 2.P2P的特点是什么? 3.如何防止消息丢失? 二.消息队列 消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题 实现高性能,高可用 ...

最新文章

  1. C语言的双向链表头插法和尾插法,指定节点删除
  2. Java接口和Java抽象类的认识
  3. java去除不为null,JAVA代码中去掉 “!=null”
  4. Kafka消费者APi
  5. Linux网络编程 | Socket编程(一):Socket的介绍、UDPSocket的封装、UDP服务器/客户端的实现
  6. mysql 引擎是表级别_Mysql表引擎优化
  7. 【Java】遍历时优雅地删除集合元素
  8. 8日直播预告丨Oracle 19c X86下移经验分享
  9. BNUOJ 7178 病毒侵袭持续中
  10. 实战申请Let's Encrypt永久免费SSL证书过程教程及常见问题
  11. java关键字_Java关键字
  12. 【Luogu】P1972HH的项链(链表+树状数组)
  13. IDEA报错:java: Compilation failed: internal java compiler error
  14. www.050604.pw ub.php,《UFIDA用友软件维护工具》050604版使用说明
  15. 微信小程序data-xx 的使用
  16. SmartToast
  17. java超链接颜色_Java技巧(一):会变色的超链接
  18. thinkphp 实现汉字转换成拼音
  19. 程序员在群里“匿名”骂老板,第二天被开除,聊天记录曝光
  20. 十大算法--支持向量机

热门文章

  1. 第一篇博客------自我介绍篇
  2. Kafka精品教学(入门,安装,Springboot整合Kafka)
  3. js 电话号码中间四位加密处理(185****2324)
  4. 对网络系统服务器存储系统工作站等,工作站/服务器网络有什么优缺点?
  5. int数据类型的取值范围
  6. 差价500,Find X3和小米11哪个好?对比后答案明显
  7. javaweb在线学习平台
  8. 无意中发现了一位北大妹子的Java仓库
  9. http 302状态码
  10. 18 对比业内已有框架的实现